【发布时间】:2013-12-03 23:35:46
【问题描述】:
我正在编写一个小脚本,它应该从我的电子邮件中读取我的工作时间并节省我已经工作的时间。它是通过正则表达式做到这一点的。 现在这是我的脚本:
导入 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()
问题是,它为我的一些字符串(不是全部,超过一半有效 [23 个有效,8 个无效])返回了 None,这意味着模式不匹配。我用大多数在线正则表达式测试器对其进行了测试,他们都告诉我,模式匹配并且一切都很好..
这里有一些不被接受但由在线工具提供的示例字符串,例如http://regex101.com
粘贴它们,因为它们又大又丑: http://pastebin.com/4Z2BdmXk http://pastebin.com/dMxcRqQu
顺便说一句,日期的正则表达式在所有情况下都可以正常工作(但不能在粘贴的字符串上,因为有很多私人信息,我不得不剪掉上部)
worked_time_pattern 应该搜索以下内容:"1,5" disabled selected style=3D"">1,5</option>(并从中取出 1,5,就像它在一半的情况下所做的那样......)
有人知道吗?
【问题讨论】:
-
我不知道这是否是问题所在,但您可能应该对正则表达式使用原始字符串,即
re.compile(r'my regex here')。注意字符串前面的“r”。 -
我刚刚在 python 解释器中测试了两个 pastebin,并且找到了两个匹配项。因为我将它粘贴到解释器中,所以我只从选择字段的开头粘贴(因为在那之后没有换行符)。
-
@rantanplan 谢谢,我改变了,但没有帮助我:/
-
@OGHaza 正如我所说,它适用于在线正则表达式测试器,也适用于我的解释器中的一半字符串。但不知何故不适合另一半
-
@gumble - 只是为了测试,您可以尝试使用以下正则表达式
"(?P<time>\d+(,\d)?)"[^>]*?selected[^>]*>=?(\r?\n?)(?P=time)<- 并不是这个正则表达式更好,它只是更宽松。我预计它仍然行不通 - 但到那时我将不得不放弃