你说“我知道它非常昂贵,因为我正在做一个特定的字符串匹配几次.”这对我来说,你正在运行每个RE几次.在这种情况下,您正在犯错误,无需编写更复杂的RE即可解决.
re1_matches = re.findall(re1,text)
re2_matches = re.findall(re2,text)
这将导致两个匹配列表.然后,您可以对这些列表执行布尔运算,以生成您需要的任何结果;或者如果您需要一个列表中的所有匹配,您可以连接它们.您也可以使用re.match(匹配在字符串的开头匹配)或re.search(匹配字符串中的任何位置),如果您不需要列表的结果,但只需要知道有匹配.
无论如何,在这种情况下创建一个更复杂的RE可能不是必需或不可取的.
但是,我并不清楚你想要什么,所以我可能错了.
关于如何使用布尔运算符来处理列表的一些建议.首先一些设置:
>>> re1 = r'(\d{1,3}[a-zA-Z]?)'
>>> re2 = r'(\babc\b)'
>>> re.findall(re1,text)
['100/64h','100h/100f']
>>> re.findall(re2,text)
['abc','abc']
>>> re1_matches = re.findall(re1,text)
>>> re2_matches = re.findall(re2,text)
>>> rex_nomatch = re.findall('conglomeration_of_sandwiches',text)
如果所有结果都为True,则返回第一个False结果或最终结果.
>>> not re1_matches and re2_matches
False
所以如果你想要列表而不是平面布尔值,你必须测试你想要的结果最后:
>>> not rex_nomatch and re1_matches
['100/64h','100h/100f']
同理:
>>> not rex_nomatch and re2_matches
['abc','abc']
如果你只想知道两个RE都产生了匹配,但是不再需要了,你可以这样做:
>>> re1_matches and re2_matches
['abc','abc']
最后,如果两个RE都产生匹配,这是一个紧凑的方法来获得连接:
>>> re1_matches and re2_matches and re1_matches + re2_matches
['100/64h','100h/100f','abc']