2

次のコードがあります。

haystack = "aaa months(3) bbb"
needle = re.compile(r'(months|days)\([\d]*\)')
instances = list(set(needle.findall(haystack)))
print str(instances)

私はそれが印刷されると思っていましたmonths(3)が、代わりにmonths. これには何か理由がありますか?

4

2 に答える 2

7
needle = re.compile(r'((?:months|days)\([\d]*\))')

問題を修正します。

月|日の部分のみをキャプチャしていました。

この特定の状況では、この正規表現の方が少し優れています。

needle = re.compile(r'((?:months|days)\(\d+\))')

この方法では、数値でのみ結果が得られます。以前は、次のような結果months()が機能していました。Months や Days などのオプションで大文字と小文字を区別しない場合は、re.IGNORECASEフラグも追加します。このような:

re.compile(r'((?:months|days)\(\d+\))', re.IGNORECASE)

OPの説明:

正規表現は多くの要素で構成されており、その主要な要素がキャプチャ グループです。" ()" しかし、キャプチャせずにグループを作成したい場合があるため、 " (?:)" を使用します。他にも多くの形式のグループがありますが、これらが最も一般的です。

この場合、正規表現全体をキャプチャ グループで囲みます。これは、通常、すべてをキャプチャしようとしているためです。正規表現は自動的にキャプチャ グループに囲まれますが、この場合は明示的に指定したため、キャプチャ グループではありませんでした。正規表現を自動キャプチャ グループで囲みます。

?:正規表現全体をキャプチャ グループで囲んだので、上記のように先頭に追加することで、グループを非キャプチャ グループに変換します。また、正規表現全体を囲み、そのグループを非キャプチャ グループにすることもできませんでした。これは、ご覧のように、正規表現全体が、非存在するキャプチャ グループに自動的に変換されるためです。私は個人的に明示的なコーディングを好みます。

正規表現の詳細については、http: //docs.python.org/library/re.htmlを参照してください。

于 2012-09-19T13:36:57.907 に答える
1

括弧はグループ化だけでなく、キャプチャ グループの形成にも使用されます。あなたが欲しいのはですre.compile(r'(?:months|days)\(\d+\)')。これは、 or 条件に非キャプチャ グループを使用し、findall を使用するときに必要と思われないサブグループ マッチの束を取得しません。

于 2012-09-19T13:42:02.680 に答える