python – 将几个正则表达式合并到一个RE中

前端之家收集整理的这篇文章主要介绍了python – 将几个正则表达式合并到一个RE中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经写了2个RE来匹配String中的多个字符串序列.例如.让我们假设两个正则表达式是RE1,RE2.字符串可以是这四种形式;
1) Match ONLY RE1 'one or more times'
2) Match ONLY RE2 'one or more times'
3) Match RE1 'one or more times' AND match RE2 'one or more times'
4) Match NEITHER RE1 NOR RE2 

目前我正在使用如果检查这些,但我知道它非常昂贵,因为我正在做一个特定的字符串匹配几次.我想到使用’或’|但问题是正则表达式将停止匹配,一旦找到第一个匹配的序列,而不是继续寻找其他的.我想找到匹配的序列“一次或多次”.

更新:

eg: RE1 = (\d{1,3}[a-zA-Z]?/\d{1,3}[a-zA-Z]?)
    RE2 = (\babc\b)
String: *some string* 100/64h *some string* 120h/90 *some string* abc 200/100 abc *some string* 100h/100f

Matches: '100/64h','120h/90','abc','200/100','100h/100f'

如何合并这2个RE来使我的程序有效.我正在使用python来代码.

解决方法

你说“我知道它非常昂贵,因为我正在做一个特定的字符串匹配几次.”这对我来说,你正在运行每个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']
原文链接:https://www.f2er.com/python/186348.html

猜你在找的Python相关文章