2017-02-09 11 views
0

私は正規表現について学んでいます。私は考えていない、どのように別の正規表現を組み合わせて、単一の一般的な正規表現を作る。Pythonで複数の正規表現を1つの正規表現に結合するにはどうすればよいですか?

複数の場合に1つの正規表現を書いてみたいです。これは、または"|"オペレータを使用して素朴なアプローチで行うことができます。

私はこのアプローチが嫌いです。誰も私に良いアプローチを教えてもらえますか?

+0

Plzを私の答えを受け入れる名前見つけます。 –

答えて

2

すべての正規表現関数をコンパイルする必要があります。 REの任意の一連のfindall

import re 
re1 = r'\d+\.\d*[L][-]\d*\s[A-Z]*[/]\d*' 
re2 = '\d*[/]\d*[A-Z]*\d*\s[A-Z]*\d*[A-Z]*' 
re3 = '[A-Z]*\d+[/]\d+[A-Z]\d+' 
re4 = '\d+[/]\d+[A-Z]*\d+\s\d+[A-z]\s[A-Z]*' 

sentences = [string1, string2, string3, string4] 
generic_re = re.compile("(%s|%s|%s|%s)" % (re1, re2, re3, re4)).findall(sentence) 
+0

@Imit Iv'e fixed。私はあなたが "generic-re"と書いた変数名を使用し、エラーを引き起こします。 –

+0

1つの要素のみを持つ文字クラスはナンセンスではありません。正規表現を読むのが難しくなります。 – Toto

1

あなたがしなければならないすべては、各リターンマッチのリストを連結している:この例をチェックしてください

re_list = [ 
    '\d+\.\d*[L][-]\d*\s[A-Z]*[/]\d*', # re1 in question, 
    ... 
    '\d+[/]\d+[A-Z]*\d+\s\d+[A-z]\s[A-Z]*', # re4 in question 
] 

matches = [] 
for re in re_list: 
    matches += re.findall(re, string) 

効率化のためにそれを使用する方がよいでしょうコンパイル済みREのリスト

は、別の方法としては、私は多くの人々が、パイプを使用している参照

generic_re = re.compile('|'.join(re_list)) 
0

使用して、要素のREの文字列を結合することができ、それは最初のインスタンスのみに一致するように思えます。すべて一致するようにしたい場合は、先読みを試してみてください。 ...次一致しますが、文字列のいずれかを消費しない場合

マッチ:

例:

>>> fruit_string = "10a11p" 
>>> fruit_regex = r'(?=.*?(?P<pears>\d+)p)(?=.*?(?P<apples>\d+)a)' 
>>> re.match(fruit_regex, fruit_string).groupdict() 
{'apples': '10', 'pears': '11'} 
>>> re.match(fruit_regex, fruit_string).group(0) 
'10a,11p' 
>>> re.match(fruit_regex, fruit_string).group(1) 
'11' 

(?= ...)は先読みです。これは先読みアサーションと呼ばれます。たとえば、Isaac(?= Asimov)は「Isaac」に続いて「Asimov」が続く場合にのみ一致します。

.*?(?P<pears>\d+)p 数がどこでも、文字列中のpを踏襲し、それはあなたのために働く場合は番号「梨」

関連する問題