gpt4 book ai didi

Python 正则表达式 : re. search() 在大型文本文件上速度极慢

转载 作者:太空狗 更新时间:2023-10-30 01:15:37 27 4
gpt4 key购买 nike

我的代码执行以下操作:

  1. 获取一个大文本文件(即 300 页的 PDF 法律文件)。
  2. 找到某个关键字(例如“small”)。
  3. 返回关键字左侧的 n 个词和关键字右侧的 n 个词。

注意:在此上下文中,“单词”是任何非空格字符的字符串。 “$cow123”将是一个词,但“health care”将是两个词。

这是我的问题:代码在 300 个页面上运行需要非常长的时间,并且随着 n 的增加,该时间往往会增加得非常快。

这是我的代码:

fileHandle = open('test_pdf.txt', mode='r')
document = fileHandle.read()

def search(searchText, doc, n):
#Searches for text, and retrieves n words either side of the text, which are returned separately

surround = r"\s*(\S*)\s*"
groups = re.search(r'{}{}{}'.format(surround*n, searchText, surround*n), doc).groups()
return groups[:n],groups[n:]

这是令人讨厌的罪魁祸首:

print search("\$27.5 million", document, 10)

以下是测试此代码的方法:从上面的代码块中复制函数定义并运行以下命令:

t = "The world is a small place, we $.205% try to take care of it."
print search("\$.205", t, 3)

我怀疑我有一个糟糕的灾难性回溯案例,但我对正则表达式太陌生了,无法指出这个问题。

如何加速我的代码?

最佳答案

如何使用 re.search(如果您只搜索固定字符串,甚至可以使用 string.find)来查找字符串,而无需任何周围的捕获组。然后在重新匹配对象上使用匹配的位置和长度(.start.end,或者 find 的返回值加上搜索字符串的长度)。获取匹配前的子串并对其执行 /\s*(\S*)\s*\z/ 等,获取匹配后的子串并执行 /\A\s*(\S*)\s*/ 等等就可以了。

此外,为了帮助您进行回溯:您可以使用类似 \s+\S+\s+ 的模式而不是 \s*\S*\s*(两个空白 block 必须由 非零 量的非空白分隔,否则它们就不会是两个 block ),并且你不应该连续使用两个 \s *就像你一样。我认为 r'\S+'.join([[r'\s+']*(n)) 会给出正确的模式来捕获 n 之前的单词(但我的Python 生锈了,所以检查一下)。

关于Python 正则表达式 : re. search() 在大型文本文件上速度极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20082920/

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