私は正規表現について学んでいます。私は考えていない、どのように別の正規表現を組み合わせて、単一の一般的な正規表現を作る。Pythonで複数の正規表現を1つの正規表現に結合するにはどうすればよいですか?
複数の場合に1つの正規表現を書いてみたいです。これは、または"|"オペレータを使用して素朴なアプローチで行うことができます。
私はこのアプローチが嫌いです。誰も私に良いアプローチを教えてもらえますか?
私は正規表現について学んでいます。私は考えていない、どのように別の正規表現を組み合わせて、単一の一般的な正規表現を作る。Pythonで複数の正規表現を1つの正規表現に結合するにはどうすればよいですか?
複数の場合に1つの正規表現を書いてみたいです。これは、または"|"オペレータを使用して素朴なアプローチで行うことができます。
私はこのアプローチが嫌いです。誰も私に良いアプローチを教えてもらえますか?
すべての正規表現関数をコンパイルする必要があります。 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)
@Imit Iv'e fixed。私はあなたが "generic-re"と書いた変数名を使用し、エラーを引き起こします。 –
1つの要素のみを持つ文字クラスはナンセンスではありません。正規表現を読むのが難しくなります。 – Toto
あなたがしなければならないすべては、各リターンマッチのリストを連結している:この例をチェックしてください
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))
使用して、要素の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を踏襲し、それはあなたのために働く場合は番号「梨」
Plzを私の答えを受け入れる名前見つけます。 –