我有一个大文本文件,并且正在使用for ... in语句逐行处理它:
f = open(sys.argv[1])
for line in f:
我通过一些正则表达式传递了这些代码。但是,当此长行通过正则表达式传递时,我的代码停止了:这是一行:
Mar 25 09:42:22 2011 amavis[30883]: (30883-10) Passed CLEAN, [95.0.85.202] [95.0.85.202] -> ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
这是正则表达式和代码停止的地方:
pattern_clean = re.compile("(\S{3} \d{2} \d{2}\:\d{2}\:\d{2} \d{4}).*CLEAN, (LOCAL )?(\[[.\d]+\] )?(\[[.\d]+\] )? -> (,)* Message-ID: , mail_id: (\S*), Hits: (\S*), queued_as: (\S*), (\S*)")
if pattern_clean.search(line) != None:
我已经尝试在其他文件上运行了此脚本,但工作正常。该文件也可以正常工作,直到出现这一行。是什么导致此问题?
解决方案
编写正则表达式可能需要非常长的时间才能匹配或失败。您已经编写了这样的正则表达式。基本上,任何时候您看到*或+嵌套在另一个内部*或+感到非常恐惧。
我认为您的问题可能是:
(,)*
自己将所有内容匹配到下一个空格,然后当完整模式不匹配时将尝试缩短匹配时间,然后外部*意味着它将尝试许多不同的组合来匹配20封电子邮件,后跟一个或19个跟着1,或18,再跟2,或18,再跟1,再跟1。
建议您尝试\S使用无法匹配终止字符的模式替换所有出现的事件。例如 ]*>或[^, ]*,可以减少问题。