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

在Python中执行多个连续的正则表达式替换。效率低下?,python,regex,replace,Python,Regex,Replace,首先,我的代码是有效的。它只是运行缓慢,我想知道我是否遗漏了一些可以提高效率的东西。我正在用python解析PDF(是的,我知道如果可能的话应该避免这种情况) 我的问题是我必须做几个相当复杂的正则表达式替换——当我说替换时,我的意思是删除。我已经做了一些先去掉大部分数据的运算,这样下一个表达式就不需要分析太多的文本,但这就是我所能想到的加速运算的方法 我对python和正则表达式还很陌生,所以很有可能会做得更好 谢谢你的阅读 regexPagePattern = r"(Wk)\d{1,2

首先,我的代码是有效的。它只是运行缓慢,我想知道我是否遗漏了一些可以提高效率的东西。我正在用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)

我不确定你是否在一个循环中做这个。如果不是,则以下内容不适用

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


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

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

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

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

这应该会使事情加快一点(相当不错的一点)。

我觉得这些正则表达式不是很复杂。更大的问题是,
contentRaw
有多大?也许没有,但我花了一段时间才想到。:)contentRaw'通常约为150kb(或125000个字符)。没错:解码字符串时的第一选择应该是
decode
函数:1m23s新处理时间1m24s旧处理时间,因此我们没有节省大量时间,但我们的编码更好。有趣的是,第一次regex运行
r.*(II)(\s)?(受影响图表的索引)
大约需要1m15,而随后的运行几乎是瞬间完成的。在OP的示例代码中,re每个只使用一次,因此添加编译可能不是太大的胜利。re模块在内部缓存编译后的表达式,所以我不确定在任何情况下都会有巨大的速度提升。问题是您是否可以/想要依赖Python库的实现细节,以及您使用该模式的频率。