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

标签 python regex performance

我有一个相当大的字符串 (~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/

相关文章:

python - 如何使用 H264 编解码器编写 mp4 视频文件?

javascript - 正则表达式与 "1 1"JavaScript 中的数字不匹配

java - 用换行符分割 Java 字符串

c++ - 从自定义集合中读取数据(结构数组)

performance - 多余的限定符有什么缺点吗?有什么好处吗?

Python - 合并两个二维列表,覆盖一个的值

python - 三次图和二次图?

python - 黑色 (Python) 忽略规则

python - 如何编写正则表达式以特定字符串开头和结尾?

java - 如何确定时间复杂度是 O(m + n) 还是 O(Math.max(m, n))