2012-01-17 6 views
7

行に正規表現パターンのセットに一致する単語が含まれているかどうかを確認する方法はありますか? もし私が[regex1, regex2, regex3]を持っていて、それらのどれかに一致する行が見たいのですが、どうすればいいですか? 今はre.findall(regex1, line)を使用していますが、一度に1正規表現にしか一致しません。Pythonを使用して複数の正規表現と一致する行

答えて

20

組み込み関数any(またはすべての正規表現が一致する必要がある場合はall)とすべての正規表現オブジェクトを利用してジェネレータ表現を使用することができます。

any (regex.match(line) for regex in [regex1, regex2, regex3])

(又はany(re.match(regex_str, line) for regex in [regex_str1, regex_str2, regex_str2])正規表現はもちろんのプリコンパイルされた正規表現オブジェクトでない場合)

それは単一の式であなたの正規表現を組み合わせると比較ineficientあろうが - このコードは時間である場合特別な| regex演算子を使って元の式を分離して、必要なものすべてを網羅する単一の正規表現を作成してみてください。 すべてregexsを結合する簡単な方法は、「参加」の文字列を使用することですオペレータ:

re.match("|".join([regex_str1, regex_str2, regex_str2]) , line)

オリジナルのものはすでにを利用して行う場合は、このフォームに正規表現を組み合わせること、間違った表現になりますが、 |オペレータ。

+2

括弧で各式をラップすると、結合方法が失敗する可能性は低くなります。 ''(foo)|(bar)|(baz) ''を返します。 – FakeRainBrigand

+3

さらに、 '(?:...)'をラップし、その論理構造を強調する方法で文字列をまとめてください。 ( 'foo'、 'bar'、 'baz')) 'の' | '.join('(?:{0})。 –

+0

私のために働きました....ありがとう – Prateek

1

この新しい正規表現を試してください:(regex1)|(regex2)|(regex3)。これは、3つの正規表現のいずれかと一致します。

+1

'(?:...)'は、疑わしいキャプチャグループの作成を避けるために、おそらく '(...)'よりも優れたアイデアです。 –

+1

@Karl ... '.group(n)'の真実性をチェックして、あなたが捕獲したグループを特定したくない場合を除きます。 –

1

正規表現の項目をループして検索します。

regexList = [regex1, regex2, regex3] 

line = 'line of data' 
gotMatch = False 
for regex in regexList: 
    s = re.search(regex,line) 
    if s: 
     gotMatch = True 
     break 

if gotMatch: 
    doSomething() 
関連する問題