小编典典

在 Python 3 中加速数百万个正则表达式替换

all

我有两个清单:

  • 大约 750K “句子” (长字符串)的列表
  • 我想从我的 75 万个句子中删除的大约 2 万个 _ “单词”的列表_

因此,我必须遍历 750K 句子 并执行大约 20K 替换, 但前提是我的单词实际上是 “单词” 并且不是更大字符串的一部分。

我通过预编译我的 单词 来做到这一点,以便它们的两侧是\b单词边界元字符:

compiled_words = [re.compile(r'\b' + word + r'\b') for word in my20000words]

然后我遍历我的 “句子”

import re

for sentence in sentences:
  for word in compiled_words:
    sentence = re.sub(word, "", sentence)
  # put sentence into a growing list

这个嵌套循环每秒 处理大约50 个句子,这很好,但处理我的所有句子仍然需要几个小时。

  • 有没有办法使用该str.replace方法(我认为它更快),但仍然要求替换只发生在 单词边界

  • 或者,有没有办法加快该re.sub方法?re.sub如果我的单词长度大于句子的长度,我已经通过跳过来稍微提高速度,但这并没有太大的改进。

我正在使用 Python 3.5.2


阅读 59

收藏
2022-08-07

共1个答案

小编典典

您可以尝试的一件事是编译一个单一模式,例如"\b(word1|word2|word3)\b".

因为re依赖 C 代码来进行实际匹配,所以可以节省大量资金。

正如@pvg 在评论中指出的那样,它也受益于单通道匹配。

2022-08-07