gpt4 book ai didi

python - 将多个正则表达式合并为一个 RE

转载 作者:太空狗 更新时间:2023-10-29 17:18:02 26 4
gpt4 key购买 nike

我写了 2 个 RE 来匹配一个 String 中的几个字符串序列。例如假设这两个正则表达式是 RE1RE2。字符串可以是这4种形式;

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 

目前我正在使用 if 来检查其中的每一个,但我知道它非常昂贵,因为我多次对特定字符串进行匹配。我想过使用 'or' | 但问题是正则表达式一旦找到第一个匹配序列就会停止匹配并且不会继续寻找其他序列。我想“一次或多次”找到匹配序列。

更新:

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/100fMatches: '100/64h', '120h/90', 'abc', '200/100', 'abc', '100h/100f'

如何合并这 2 个 RE 以使我的程序高效。我正在使用 python 对此进行编码。

最佳答案

你说“我知道它非常昂贵,因为我多次对特定字符串进行匹配。”这对我来说意味着您要多次运行每个 RE。在这种情况下,您犯了一个错误,无需编写更复杂的 RE 即可解决。

re1_matches = re.findall(re1, text)
re2_matches = re.findall(re2, text)

这将产生两个匹配列表。然后,您可以对这些列表执行 bool 运算以生成您需要的任何结果;或者,如果您需要一个列表中的所有匹配项,则可以将它们连接起来。如果您不需要,您还可以对其中的每一个使用 re.match(匹配锚定在字符串的开头)或 re.search(匹配字符串中的任何位置)结果列表,但只需要知道有匹配即可。

无论如何,在这种情况下创建更复杂的 RE 可能没有必要或不可取。

但我并不能立即清楚你到底想要什么,所以我可能是错的。


关于如何使用 bool 运算符处理列表的一些建议。首先进行一些设置:

>>> re1 = r'(\d{1,3}[a-zA-Z]?/\d{1,3}[a-zA-Z]?)'
>>> re2 = r'(\babc\b)'
>>> re.findall(re1, text)
['100/64h', '120h/90', '200/100', '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)

and 返回第一个 False 结果,如果所有结果都为 True,则返回最终结果。

>>> not re1_matches and re2_matches
False

所以如果你想要列表而不是一个简单的 bool 值,你必须最后测试你想要的结果:

>>> not rex_nomatch and re1_matches
['100/64h', '120h/90', '200/100', '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', '120h/90', '200/100', '100h/100f', 'abc', 'abc']

关于python - 将多个正则表达式合并为一个 RE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6613831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com