2017-02-09 104 views
0

我正在學習正則表達式。我沒有想法,如何結合不同的正則表達式來製作單一的泛型正則表達式。如何在Python中將多個正則表達式合併爲一個正則表達式?

我想寫一個單一的正則表達式,多個案例。我知道這可以通過使用「|」運營商與天真的做法。

我不喜歡這種方法。有人能告訴我更好的方法嗎?

+0

PLZ接受我的答案,如果你的作品。 –

回答

2

您需要編譯所有的正則表達式函數。檢查這個例子:

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

@Amit Iv'e修復它。我使用了你寫的「generic-re」的變量名,並導致錯誤。 –

+0

只有一個元素的字符類是nonsens,使正則表達式難以閱讀。 – Toto

1

findall與任意系列的RE所有你需要做的是串聯匹配的列表,每個回報:

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字符串,但似乎只匹配第一個實例。如果你想匹配所有,然後嘗試使用lookaheads。

例子:

>>> 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)只有跟隨着'Asimov'纔會匹配'Isaac'。

.*?(?P<pears>\d+)p 找到一個數字後面的p字符串中的任何位置和名稱中的數字「梨」