<分区>
我正在做一个小脚本,它应该从我的电子邮件中读取我的工作时间并保存我已经工作了多少时间。它是通过正则表达式来做到这一点的。 现在这是我的脚本:
导入imaplib 重新进口 从 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()
问题是,它返回 None
对于我的一些字符串的 worked_time(不是全部,一半以上有效 [23 个有效,8 个无效]),这意味着模式不匹配。我用大多数在线正则表达式测试器对其进行了测试,他们都告诉我,模式匹配并且一切正常..
这里有一些未被接受但被在线工具接受的示例字符串,例如http://regex101.com
粘贴它们,因为它们又大又丑: http://pastebin.com/4Z2BdmXk http://pastebin.com/dMxcRqQu
顺便说一句,日期的正则表达式在所有情况下都可以正常工作(但在粘贴的字符串上却不行,因为有很多私有(private)信息,我不得不剪掉上半部分)
worked_time_pattern 应搜索如下内容:"1,5" disabled selected style=3D"">1,5</option>
(并从中取出 1,5
,就像它在一半情况下所做的一样……)
有人知道吗?