次のコードがあります。
haystack = "aaa months(3) bbb"
needle = re.compile(r'(months|days)\([\d]*\)')
instances = list(set(needle.findall(haystack)))
print str(instances)
私はそれが印刷されると思っていましたmonths(3)
が、代わりにmonths
. これには何か理由がありますか?
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を参照してください。
括弧はグループ化だけでなく、キャプチャ グループの形成にも使用されます。あなたが欲しいのはですre.compile(r'(?:months|days)\(\d+\)')
。これは、 or 条件に非キャプチャ グループを使用し、findall を使用するときに必要と思われないサブグループ マッチの束を取得しません。