【问题标题】:Regex not working locally though working in every online regex tester [duplicate]尽管在每个在线正则表达式测试器中工作,但正则表达式无法在本地工作 [重复]
【发布时间】: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""&gt;1,5&lt;/option&gt;(并从中取出 1,5,就像它在一半的情况下所做的那样......)

有人知道吗?

【问题讨论】:

  • 我不知道这是否是问题所在,但您可能应该对正则表达式使用原始字符串,即re.compile(r'my regex here')。注意字符串前面的“r”。
  • 我刚刚在 python 解释器中测试了两个 pastebin,并且找到了两个匹配项。因为我将它粘贴到解释器中,所以我只从选择字段的开头粘贴(因为在那之后没有换行符)。
  • @rantanplan 谢谢,我改变了,但没有帮助我:/
  • @OGHaza 正如我所说,它适用于在线正则表达式测试器,也适用于我的解释器中的一半字符串。但不知何故不适合另一半
  • @gumble - 只是为了测试,您可以尝试使用以下正则表达式 "(?P&lt;time&gt;\d+(,\d)?)"[^&gt;]*?selected[^&gt;]*&gt;=?(\r?\n?)(?P=time)&lt; - 并不是这个正则表达式更好,它只是更宽松。我预计它仍然行不通 - 但到那时我将不得不放弃

标签: python regex


【解决方案1】:

如果您认为它会将=\r\n 插入到您的数据中,请继续删除它,同时删除所有\rs 和\ns。

mailbody = "".join(data[0][1].split("=\r\n"))
mailbody = "".join(data[0][1].split("\r"))
mailbody = "".join(data[0][1].split("\n"))

然后尝试使用我在 cmets 中建议的正则表达式 - 尽管您的原始表达式可能也可以正常工作。

(?P<time>\d+(,\d)?)"[^>]*?selected[^>]*>=?(\r?\n?)(?P=time)<

正如 Quirliom 在 cmets 中所建议的,这是一个完美的例子,说明为什么不应该使用正则表达式来解析 HTML - 尽管如果换行符出现在单词中间,那么这也不是有效的 HTML。

【讨论】:

  • 嘿,再次感谢。我编辑了它,但它仍然无法工作:/ 仍然有 23 个工作/ 8 个没有。那我会用什么来解析 HTML 呢?我认为像这样的东西是正则表达式的用途,但如果有替代方案,我愿意接受!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多