2

私は正規表現にかなり慣れていません、そして私は理解できない問題に遭遇しました:

任意の数のAZ、0〜9、および_文字で始まる文字のセットを一致させようとしています。これらの文字の後には、オプションで1つの括弧のセットで囲まれた数字が続き、元の文字列からスペース(またはそうでない)

これが見つけるべきものの例:

_ABCD1E
_123FD(13)
ABDF1G (2)

これは私の現在の正規表現です:

[A-Z_0-9]+\s*\({0,1}[\d]*\){0,1}

すべてが正常に検出されていますが、次の場合に問題が発生します。

_ABCDE )

「)」ではなく_ABCDEのみを取得する必要がありますが、現在は「_ABCDE)」を取得しています。

(#)を取得しても、そのパターン全体が存在しない場合に余分な文字を取得できない方法はありますか?

可能であれば、答えを得るだけでなく、私が学びたいと思っている構文を説明してください。

答え:次のコードは、私がこれまでに必要としていたものに対して機能しています。

[A-Z_0-9]+(\s*\([\d]+\)){0,1}
# or, as has been mentioned, the above can be simplified
# and cleaned up a bit to be
[A-Z_0-9]+(\s*\(\d+\))?
# The [] around \d are unnecessary and {0,1} is equivalent to ?

(#)パターンの前後に括弧を追加すると、?を使用できます。またはパターン全体で{0,1}。また、[\d]*を[\d]+に変更して、括弧内に少なくとも1つの数字が含まれるようにしました。

迅速な回答をありがとう、すべて!

4

5 に答える 5

1

あなたの正規表現は、各パレン(開いているものと閉じているもの)が独立してそこにある場合とない場合があると言っています。代わりに、括弧で囲まれた数がそこにある場合とない場合があると言う必要があります。

(\([\d]*\)){0,1}

これにより、親には何も存在しないことに注意してください。それはあなたの正規表現が言ったことですが、それがあなたが実際に望んでいることかどうかはわかりません。

于 2013-02-13T14:47:40.713 に答える
0

どうですか

^[A-Z0-9_]+\s*(\([0-9]+\))?$

ところで、あなたの例から、最初の部分はだけ[A-Z_]でなく、[0-9]

于 2013-02-13T14:50:40.793 に答える
0

これでうまくいくようです。

[1-9A-Z_]+\s*(?:\([1-9]*\))?
于 2013-02-13T14:51:04.047 に答える
0

次の正規表現が必要なようです。

^[A-Z\d_]+(\s*\(\d+\))?$
于 2013-02-13T14:52:32.567 に答える
0

結果のグループ化の一致を回避するために、非キャプチャグループを使用しました。

>>> pattern = r'[A-Z_]+\s*(?:\(\d+\)|\d*)'
>>> l = ['_ABCD1E', '_123FD(13)', 'ABDF1G (2)', '_ABCDE )', 'A_B (15)', 'E (345']
>>> [re.search(pattern , i).group() for i in l]
['_ABCD1', '_123', 'ABDF1', '_ABCDE ', 'A_B (15)', 'E ']
于 2013-02-13T14:54:09.697 に答える