在Python中进行多个连续的正则表达式替换。效率低下?

时间:2012-03-13 13:27:48

标签: python regex replace

首先关闭 - 我的代码有效。它只是运行缓慢,我想知道我是否遗漏了一些能让它变得更有效率的东西。我正在使用python解析PDF(是的,我知道如果可能的话应该避免这样做。)

我的问题是我必须做几个相当复杂的正则表达式替换 - 当我说替换时,我的意思是删除。我已经做了那些首先删除最多数据的那些,以便下一个表达式不需要分析太多的文本,但这是我能想到的所有加速的东西。

我对python和正则表达式都很陌生,所以可以想象这可以做得更好。

感谢阅读。

    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)

2 个答案:

答案 0 :(得分:4)

我不确定你是否在循环内执行此操作。如果不适用,则不适用。

如果多次使用模式,则应使用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,并使用生成的数据片段对数组进行操作。我不完全确定它是如何实现的,但我认为re.sub创建文本片段并最终将它们合并为一个字符串,这很昂贵。在最后一步之后,您可以使用" ".join(fragments)加入数组。显然,如果您的模式在某处重叠,则此方法将不起作用。

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

答案 1 :(得分:0)

正在尝试解码字符串时,正则表达式始终是最后的选择。因此,如果您看到另一种解决问题的可能性,请使用它。

也就是说,您可以使用re.compile预编译正则表达式模式:

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

这应该可以加快速度(非常好的一点;))