嘿,我遇到了一个问题,我的程序由于某些原因无法理解而停止了对57802记录中的文件的迭代。我放了一个心跳区,这样我就可以看到它在哪一行上,它有帮助,但现在我被困在为什么它停在这里。我以为这是内存问题,但我只是在我的6GB内存计算机上运行,它仍然停止。
有没有更好的方法来做我下面要做的事情?
我的目标是读取文件(如果需要我发送给你,我可以15MB的文本日志)
根据正则表达式查找匹配项并打印匹配行。还有更多,但这是我所能做到的。我正在使用Python2.6
任何想法都会有帮助,代码注释也!我是个巨蟒迷,还在学习。

import sys, os, os.path, operator
import re, time, fileinput

infile = os.path.join("C:\\","Python26","Scripts","stdout.log")

start = time.clock()

filename  = open(infile,"r")

match = re.compile(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),\d{3} +\w+ +\[([\w.]+)\] ((\w+).?)+:\d+ - (\w+)_SEARCH:(.+)')

count = 0
heartbeat = 0
for line in filename:
    heartbeat = heartbeat + 1
    print heartbeat
    lookup = match.search(line)
    if lookup:
        count = count + 1
        print line
end = time.clock()
elapsed = end-start
print "Finished processing at:",elapsed,"secs. Count of records =",count,"."

filename.close()

这是57802行,在这里它失败了:
2010-08-06 08:15:15,390 DEBUG [ah_admin] com.thg.struts2.SecurityInterceptor.intercept:46 - Action not SecurityAware; skipping privilege check.

这是一个匹配的行:
2010-08-06 09:27:29,545 INFO  [patrick.phelan] com.thg.sam.actions.marketmaterial.MarketMaterialAction.result:223 - MARKET_MATERIAL_SEARCH:{"_appInfo":{"_appId":21,"_companyDivisionId":42,"_environment":"PRODUCTION"},"_description":"symlin","_createdBy":"","_fieldType":"GEO","_geoIds":["Illinois"],"_brandIds":[2883],"_archived":"ACTIVE","_expired":"UNEXPIRED","_customized":"CUSTOMIZED","_webVisible":"VISIBLE_ONLY"}

前5行的示例数据:
2010-08-06 00:00:00,035 DEBUG [] com.thg.sam.jobs.PlanFormularyLoadJob.executeInternal:67 - Entered into PlanFormularyLoadJob: executeInternal
2010-08-06 00:00:00,039 DEBUG [] com.thg.ftpComponent.service.JScapeFtpService.open:153 - Opening FTP connection to sdrive/[email protected]:21
2010-08-06 00:00:00,040 DEBUG [] com.thg.sam.email.EmailUtils.sendEmail:206 - org.apache.commons.mail.MultiPartEmail@446e79
2010-08-06 00:00:00,045 DEBUG [] com.thg.sam.services.OrderService.getOrdersWithStatus:121 - Orders list size=13
2010-08-06 00:00:00,045 DEBUG [] com.thg.ftpComponent.service.JScapeFtpService.open:153 - Opening FTP connection to sdrive/[email protected]:21

最佳答案

你的问题肯定是@paulrubel指出的部分:

((\w+).?)+:\d+

现在您已经添加了示例数据,显然.应该匹配一个文本点,这意味着您应该对它进行转义(\.)。而且,你不需要括号的内部集合,外部集合应该是非捕获的,但它是杀死你的基本结构;有太多的单词字符和点的排列,在放弃之前必须尝试。在尝试正则表达式的那一部分之前,其他行都会失败,这就是为什么您对它们没有任何问题。
当我在RegexBuddy中尝试时,您的regex在186步中匹配好的行,并在1000000步后放弃在57802行上的尝试。当我逃离这个点时,好的线只需要90步就可以匹配,但它仍然在57802线上超时。但现在我知道regex的一部分只能匹配单词字符和点。一旦它消耗了所有它能消耗的,下一位就必须匹配;如果它不匹配,我知道尝试其他安排是没有意义的。我可以用一个原子群告诉它不要麻烦:
(?>(?:\w+\.?)+):\d+

有了这个变化,好的行将在83个步骤中匹配,而57802行只需要66个步骤来报告失败。但是使用原子组并不总是可行的,所以您应该尝试使regex符合它匹配的文本的实际结构。在本例中,您将匹配看起来像Java类名的内容(一些单词字符,后跟零个或多个实例(一个点和多个单词字符))后跟冒号和行号:
\w+(?:\.\w+)*:\d+

当我将它插入regex时,它在80步中匹配好的行,在67步中拒绝57802行——甚至不需要原子组。

关于python - 为什么我的代码停止了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3614075/

10-13 09:38