我正在做一个小脚本,它应该从我的电子邮件中读取我的工作时间,节省我已经工作的时间。它是通过正则表达式来实现的。 下面是我的剧本:
导入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个不工作])返回{
这里有几个不被接受但被联机工具接受的字符串示例,例如http://regex101.com
因为它们又大又丑: http://pastebin.com/4Z2BdmXkhttp://pastebin.com/dMxcRqQu
顺便说一句,regex for date在所有情况下都能正常工作(但是在粘贴的字符串上没有,因为有很多私人信息,我不得不去掉上面部分)
工作的时间模式应该搜索如下内容:"1,5" disabled selected style=3D"">1,5</option>
(并从中获取1,5
,例如在一半的情况下…)
有人知道吗?在
如果您认为它正在将}s
=\r\n
插入到数据中,那么继续删除它,同时还要删除所有\r
和{然后尝试使用我在评论中建议的正则表达式-尽管您的原始表达式可能也可以正常工作。在
^{pr2}$正如Quirliom在评论中指出的,这是一个很好的例子,说明了为什么不应该使用regex来解析HTML——尽管如果换行符出现在中间单词中,那么这也不是有效的HTML。在
相关问题 更多 >
编程相关推荐