我正在做一个小脚本,应该从我的电子邮件中读取我的工作时间,并节省我已经工作了多少时间。它是通过正则表达式来实现的。 现在这是我的剧本:
导入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
,这与其中一半案例的内容相同...)
有人有什么想法吗?
答案 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。