2009-05-24 16 views
5

Python正規表現では、名前付きグループと名前なしグループの両方が '('と ')'で定義されます。これは奇妙な動作につながります。正規表現Python、正規表現、名前付きグループ、 "論理演算子"

"(?P<a>1)=(?P<b>2)" 

は値「2」と「1 = 2」「」値「1」と名付けグループと「b」をという名前のグループを見つけるテキストに使用します。しかし、私は「論理的または」演算子を使用して、複数のルールを連結し、以下の正規表現したい場合:「1 = 2」は「1 = 2」の値を持つ無名のグループを見つける同じテキストで使用

"((?P<a>1)=(?P<b>2))|(?P<c>3)" 

。正規表現エンジンは、グループ "a"と "b"を名前のないグループとして囲む "("と ")"を扱い、見つかったと報告していることを理解しました。しかし、私は無名のグループが報告されることを望んでいない、私はちょうど "|"複数の正規表現を一緒に「接着」するために使用します。寄生の無名のグループを作成せずに。それはPythonでそうする方法ですか?

答えて

13

使用(?:)無名のグループを取り除くために:

r"(?:(?P<a>1)=(?P<b>2))|(?P<c>3)" 

reのドキュメントから:

(?:...) 正規表現の丸括弧の非グループ化バージョン。 正規表現が 括弧の中に一致しますが、 の一致を実行したあと、または後で というパターンで参照すると、グループによって に一致する部分文字列を取得することはできません。

ところで、代替え演算子|は、あなたのような場合にかっこを不要にするために、優先順位が非常に低くなっています。余分なカッコを正規表現で削除しても、引き続き正常に動作します。

r"(?P<a>1)=(?P<b>2)|(?P<c>3)" 
+0

ありがとう、魅力的です^ _ ^ – grigoryvp