gpt4 book ai didi

python - 正则表达式 '|' 运算符与每个子表达式的单独运行

转载 作者:太空狗 更新时间:2023-10-30 00:27:13 41 4
gpt4 key购买 nike

我有一个相当大的字符串 (~700k),我需要针对它运行 10 个正则表达式并计算任何正则表达式的所有匹配项。我快速而肮脏的 impl 是做类似 re.search('(expr1)|(expr2)|...') 的事情,但我想知道我们是否会通过循环匹配看到任何性能提升:

换句话说,我想比较以下方面的性能:

def CountMatchesInBigstring(bigstring, my_regexes):
"""Counts how many of the expressions in my_regexes match bigstring."""
count = 0
combined_expr = '|'.join(['(%s)' % r for r in my_regexes])
matches = re.search(combined_expr, bigstring)
if matches:
count += NumMatches(matches)
return count

对比

def CountMatchesInBigstring(bigstring, my_regexes):
"""Counts how many of the expressions in my_regexes match bigstring."""
count = 0
for reg in my_regexes:
matches = re.search(reg, bigstring)
if matches:
count += NumMatches(matches)
return count

明天我将停止偷懒并运行一些测试(并发布结果),但我想知道答案是否会跳到真正了解正则表达式如何工作的人:)

最佳答案

这两件事会给出略有不同的结果,除非保证匹配将匹配一个且仅一个正则表达式。否则,如果某项匹配 2,它将被计算两次。

理论上,您的解决方案应该更快(如果表达式是互斥的),因为正则表达式编译器应该能够制作更高效的搜索状态机,因此只需要一次通过。我希望差异很小,除非表达式非常相似。

此外,如果它是一个巨大的字符串(大于 700k),进行一次传递可能会有好处,因此需要减少 n 次内存交换(到磁盘或 cpu 缓存)。

我敢打赌,在您的测试中它并不是很明显。我对实际结果感兴趣 - 请发布结果。

关于python - 正则表达式 '|' 运算符与每个子表达式的单独运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/580993/

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