当前位置: 首页 > 知识库问答 >
问题:

加速Python3中数百万regex替换

危晨
2023-03-14

我有两个清单:

  • 约750k个“句子”(长字符串)的列表
  • 要从750k个句子中删除的大约20k个“单词”的列表

所以,我必须遍历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

  • 共有1个答案

    乔宏峻
    2023-03-14

    您可以尝试的一件事是编译一个模式,如“\b(word1word2word3)\b”

    因为re依赖于C代码来进行实际的匹配,所以节省的成本是巨大的。

    正如@pvg在评论中指出的,也得益于单传匹配。

    如果你的话不是regex的话,Eric的回答更快。

     类似资料:
    • 问题内容: 我正在使用Python 3.5.2 我有两个清单 大约750,000个“句子”(长字符串)的列表 我想从我的750,000个句子中删除的大约20,000个“单词”的列表 因此,我必须遍历750,000个句子并执行大约20,000个替换,但前提是我的单词实际上是“单词”,并且不属于较大的字符串。 我这样做是通过预编译我的单词,使它们位于\b元字符的两侧 然后我遍历我的“句子” 这个嵌套循

    • 问题内容: 使用JavaScript,我将名称从网页中拉出并以某种方式将它们串在一起(可能与数组一起使用)。将所有名称收集在一起后,我需要制作另一个字符串,以提供名称的所有电子邮件地址。电子邮件地址不在网页上,因此我必须以某种方式列出脚本中所有可能的thisName = thisEmail。我本打算通过发表大量的if语句来解决这个问题,但我认为必须有一种更有效的方法。有什么建议么? 问题答案: 一

    • 问题内容: 我最近发现并修复了我正在处理的站点中的错误,该错误导致表中有数百万行重复的数据行,即使没有行也将非常大(仍然有数百万行)。我可以轻松找到这些重复的行,并可以运行一个删除查询来杀死它们。问题是试图一次删除这么多行会长时间锁定表,如果可能的话,我想避免这种情况。我可以看到摆脱这些行而又不占用站点(通过锁定表)的唯一方法是: 编写一个脚本,该脚本将循环执行数千个较小的删除查询。从理论上讲,这

    • 问题内容: 有没有一种方法可以使用DecimalFormat(或其他一些标准格式化程序)来格式化数字,如下所示: 1,000,000 => 100万 1,234,567 => 1.23M 1,234,567,890 => 1234.57M 基本上是将某个数字除以100万,保留小数点后两位,并在最后打一个’M’。我曾考虑过创建NumberFormat的新子类,但它看起来比我想象的要复杂。 我正在编写

    • 问题内容: 我正在使用Java / Groovy通过RegEx在字符串上查找匹配项(并提取它们)。在性能上,可以说在5000个字符的字符串上找到200个或更多正则表达式匹配项的最佳方法是什么。简而言之,是否可以避免为每个RegEx扫描字符串? 我可以使用java提供的Pattern和Matcher类,但随后必须编译200个模式,然后将字符串传递给matcher 200次。这是唯一的方法吗? 问题答

    • 我有一个“Customer”表,它有将近120万条记录,其中一列是ntext类型的“customer_records ”,它包含xml数据。我需要在该列的所有现有记录中替换一个url值。我尝试了下面的替换查询,但是执行该查询需要大约20分钟的时间。 在更新期间,CPU 消耗被利用到最大,这引起了问题。在 120 万条记录中,实际更新的记录中有 60 万条记录,但查询需要读取每条记录以查找和替换 U