加速python中的一系列正则表达式替换

时间:2012-08-25 04:27:39

标签: python regex

我的python脚本会读取文件中的每一行,并在每行中执行许多正则表达式替换。

如果正则表达式成功,请跳到下一行

有没有办法加速这种脚本?
是否值得调用subn并检查是否已完成更换,然后跳到剩下的那个? 如果我编译正则表达式,是否可以将所有已编译的正则表达式存储在内存中?

for file in files:  
     for line in file:  
         re.sub() # <--- ~ 100 re.sub

PS:每个正则表达式的替换vaires

2 个答案:

答案 0 :(得分:2)

你应该做三件事:

  1. 减少正则表达式的数量。根据替换部分的不同,您可以将它们全部合并为一个。使用仔细的交替,您可以确定正则表达式的部分匹配顺序。
  2. 如果可能(取决于文件大小),请将文件完全读入内存。
  3. 编译你的正则表达式(仅为了可读性;只要正则表达式的数量保持在100以下,就速度而言无关紧要。)
  4. 这给你类似的东西:

    regex = re.compile(r"My big honking regex")
    for datafile in files:
        content = datafile.read()
        result = regex.sub("Replacement", content)
    

答案 1 :(得分:2)

正如@Tim Pietzcker所说,你可以通过制作替代品来减少正则表达式的数量。您可以使用匹配对象的“lastindex”属性来确定匹配的替代方案。

以下是您可以做的一个示例:

>>> import re
>>> replacements = {1: "<UPPERCASE LETTERS>", 2: "<lowercase letters>", 3: "<Digits>"}
>>> def replace(m):
...     return replacements[m.lastindex]
...
>>> re.sub(r"([A-Z]+)|([a-z]+)|([0-9]+)", replace, "ABC def 789")
'<UPPERCASE LETTERS> <lowercase letters> <Digits>'