python - 虽然在每个在线正则表达式测试器中工作,但正则表达式不能在本地工作

标签 python regex

<分区>

我正在做一个小脚本,它应该从我的电子邮件中读取我的工作时间并保存我已经工作了多少时间。它是通过正则表达式来做到这一点的。 现在这是我的脚本:

导入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,就像它在一半情况下所做的一样……)

有人知道吗?

最佳答案

如果您认为它正在将 =\r\n 插入到您的数据中,那么继续删除它,但同时删除所有 \r\ns。

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。

关于python - 虽然在每个在线正则表达式测试器中工作,但正则表达式不能在本地工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20363933/

相关文章:

php - 正则表达式:匹配除包含 ".js"和 ".css"的任何 URL

Java - 多行正则表达式大字符串性能不佳

regex - 如何在 Cygwin 中的 grep 中使用正则表达式 OR?

python - 使用多个 CPU 进行 Scikit-learn 机器学习模型训练

python - 出现在 Django URL 中的站点名称

java - 如何在 java 中创建类似于 python 中的字典?

ios - 从字符串创建 Twitter 句柄数组

java - 在Java中使用正则表达式查找和替换而不改变文件格式

python - 在 python 中加入列表和元组

python - Pythonic 方式的递归生成器?