Regex不在本地工作,尽管在每个在线Regex tes中工作

2024-05-20 15:27:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

导入imaplib 进口re 从pprint导入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个不工作])返回{},这意味着模式不匹配。我用大多数在线regex测试人员测试了它,他们都告诉我,模式匹配,一切正常。。在

这里有几个不被接受但被联机工具接受的字符串示例,例如http://regex101.com

因为它们又大又丑: http://pastebin.com/4Z2BdmXkhttp://pastebin.com/dMxcRqQu

顺便说一句,regex for date在所有情况下都能正常工作(但是在粘贴的字符串上没有,因为有很多私人信息,我不得不去掉上面部分)

工作的时间模式应该搜索如下内容:"1,5" disabled selected style=3D"">1,5</option>(并从中获取1,5,例如在一半的情况下…)

有人知道吗?在


Tags: recomdatadatetimecount时间mail
1条回答
网友
1楼 · 发布于 2024-05-20 15:27:49

如果您认为它正在将=\r\n插入到数据中,那么继续删除它,同时还要删除所有\r和{}s

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

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

^{pr2}$

正如Quirliom在评论中指出的,这是一个很好的例子,说明了为什么不应该使用regex来解析HTML——尽管如果换行符出现在中间单词中,那么这也不是有效的HTML。在

相关问题 更多 >