首先关闭 - 我的代码有效。它只是运行缓慢,我想知道我是否遗漏了一些能让它变得更有效率的东西。我正在使用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)
答案 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)
这应该可以加快速度(非常好的一点;))