正则表达式不是在本地工作,但在每个在线正则表达式测试工具中工作

时间:2013-12-03 23:35:46

标签: python regex

我正在做一个小脚本,应该从我的电子邮件中读取我的工作时间,并节省我已经工作了多少时间。它是通过正则表达式来实现的。 现在这是我的剧本:

导入imaplib     进口重新     来自pprint import pprint

mail = imaplib.IMAP4_SSL('imap.gmail.com',993)
mail.login('*************', '**************')
# Out: list of "folders" aka labels in gmail.
mail.select("inbox") # connect to inbox.

typ, data = mail.search(None, 'SUBJECT', 'Zeiterfassung')

worked_time_pattern = re.compile(r'"(?P<time>\d+(,\d)?)"[^>]*?selected[^>]*>=?(\r?\n?)(?P=time)<')
# old version: worked_time_pattern = re.compile(r'\"(?P<time>[0-9]+(?:[,][0-9])?)\"(?: disabled)? selected(?: disabled)? style=3D"">[=]?[\n]?(?P=time)<\/option>')
date_pattern = re.compile('.*Date: [a-zA-Z]{1,4}[,] (?P<date>[0-9]{1,2} [a-zA-Z]{1,4} [0-9]{4}).*', re.DOTALL)
count = 0
countFail = 0
if 'OK' == typ:
    for num in data[0].split():
        typ, data = mail.fetch(num, '(RFC822)')
        mailbody = "".join(data[0][1].split("=\r\n"))
        mailbody = "".join(mailbody.split("\r"))
        mailbody = "".join(mailbody.split("\n"))
        worked_time = worked_time_pattern.search(data[0][1])
        date = date_pattern.match(data[0][1])
        if worked_time != None:
            print worked_time.group('time')
            count = count + 1
        else:
            print mailbody
            countFail = countFail + 1
        print worked_time
        print "You worked  on %s\n" % ( date.group('date'))
        #print 'Message %s\n%s\n' % (num, data[0][1])
    print count
    print countFail
mail.close()

mail.logout()

问题是,对于我的一些字符串(不是全部,超过一半的作品[23个作品,8个不是]),它返回None的working_time,这意味着该图案不匹配。我和大多数在线正则表达式测试人员测试过,他们都告诉我,模式匹配,一切都很好..

这里是一些不被接受但是通过在线工具的示例字符串,例如http://regex101.com

粘贴它们,因为它们又大又丑: http://pastebin.com/4Z2BdmXk http://pastebin.com/dMxcRqQu

顺便说一句,日期的正则表达式在所有方面都可以正常工作(但由于大量私人信息,我不得不删除上部的粘贴字符串)

working_time_pattern应该搜索类似于:"1,5" disabled selected style=3D"">1,5</option>的内容(并从中获取1,5,这与其中一半案例的内容相同...)

有人有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果您认为它会在您的数据中插入=\r\n,请继续删除该数据,同时删除所有\r\n

mailbody = "".join(data[0][1].split("=\r\n"))
mailbody = "".join(data[0][1].split("\r"))
mailbody = "".join(data[0][1].split("\n"))

然后尝试使用我在评论中建议的正则表达式 - 虽然您的原始表达式也可能正常工作。

(?P<time>\d+(,\d)?)"[^>]*?selected[^>]*>=?(\r?\n?)(?P=time)<

正如Quirliom在评论中所建议的那样,这是为什么正则表达式不应该用于解析HTML的一个很好的例子 - 尽管如果换行符存在于中间单词中,那么这也不是有效的HTML。