在Python中执行多个连续的regex替换。效率低下?

2024-10-03 04:34:46 发布

您现在位置:Python中文网/ 问答频道 /正文

首先-我的代码有效。它只是运行缓慢,我想知道我是否遗漏了一些能让它更高效的方法。我正在用python解析pdf(是的,我知道如果可能的话应该尽量避免)。在

我的问题是我必须做几个相当复杂的正则表达式替换——当我说替换时,我的意思是删除。我已经做了那些首先去掉大部分数据的操作,这样下一个表达式就不需要分析太多的文本,但这就是我所能想到的加快速度的方法。在

我对python和regex还很陌生,所以很有可能会做得更好。在

谢谢你的阅读。在

    regexPagePattern = r"(Wk)\d{1,2}.\d{2}(\d\.\d{1,2})"
    regexCleanPattern = r"(\(continued\))?((II)\d\.\d{1,2}|\d\.\d{1,2}(II)|\d\.\d{1,2})"
    regexStartPattern = r".*(II)(\s)?(INDEX OF CHARTS AFFECTED)"
    regexEndPattern = r"(II.)\d{1,5}\((P|T)\).*"
    contentRaw = re.sub(regexStartPattern,"",contentRaw)
    contentRaw = re.sub(regexEndPattern,"",contentRaw)
    contentRaw = re.sub(regexPagePattern,"",contentRaw)
    contentRaw = re.sub(regexCleanPattern,"",contentRaw)

Tags: 数据方法代码文本repdf表达式ii
2条回答

当试图解码字符串时,正则表达式总是最后的选择。所以如果你看到了解决问题的另一种可能性,那就用它。在

也就是说,你可以用重新编译要预编译正则表达式模式:

regexPagePattern = re.compile(r"(Wk)\d{1,2}.\d{2}(\d\.\d{1,2})")
regexPagePattern.sub("",contentRaw)

这会让事情加快一点(相当不错;)

我不确定你是不是在一个循环里做这个。如果没有,以下内容不适用。在

如果多次使用模式,则应使用re.compile( ... )编译它。这样,模式只编译一次。速度的增加应该是巨大的。最小示例:

>>> a="a b c d e f"
>>> re.sub(' ', '-', a)
'a-b-c-d-e-f'
>>> p=re.compile(' ')
>>> re.sub(p, '-', a)
'a-b-c-d-e-f'

另一个想法:使用re.split( ... )而不是{},并使用数据的结果片段对数组进行操作。我不完全确定它是如何实现的,但我认为re.sub会创建文本片段并最终将它们合并到一个字符串中,这是非常昂贵的。在最后一步之后,您可以使用" ".join(fragments)加入数组。显然,如果您的模式在某个地方重叠,这个方法将不起作用。在

在更改之前和之后获取程序的时间信息是很有趣的。在

相关问题 更多 >