在正则表达式中,如何匹配任意数量的任意字符(例如,(.|\n)*)而不消耗可能遵循的其他匹配?如果这个问题不清楚,这是我的情况:
在一个文本文件中,我有一堆包含标题的电子邮件都粘贴在一起。
编辑:下面的清洁版本在换行符的开头有每个标题。我的实际数据可能会,也可能不会。每个标头组件(如'From: xxx')前面可能有任何东西或什么都没有。在某些情况下,许多电子邮件和标题可能都在一条线上,在一堆其他杂物之后。最重要的是,我需要识别其他包含“发件人:”的电子邮件标题。所以,我需要识别整个标题样式。
在我编辑之前给出的几个答案依赖于 ^ 或制表符分隔之类的东西,我不能指望它们。他们似乎可以稍微修改一下,但我(显然)对正则表达式不太好,而且我自己也无法调整它们。我很抱歉之前忽略了这一点,只是为了让几个回答者抓住它......我对正则表达式缺乏经验的另一个产品。
这是一个丑陋的版本- 这是我实际上试图匹配的字符串。它包含两个标题和要提取的消息。
emailsString = u"""From:\n Lastname, Firstname\n Sent:\n Monday, June 24, 2013 1:48 PM\n To:\n Othername, Name\n Subject:\n RE: Center update\n Message message message.\n Such a lovely message\n Take care,\n Firstname Lastname, MS\n Long signature\n in this email\n \n E-mail:\n email@email.com\n Web\n my blog\n From:\n Lastname, Firstname\n Sent:\n Monday, June 24, 2013 9:33 AM\n To:\n Othername, Name\n Subject:\n Center update\n Importance:\n High\n Good Morning Name,\n I hope this finds you doing well.\n I wanted to inform you of some changes. The Center will be closing August 30\n th\n . or September 1\n st\n . I\u2019ve enjoyed my experience. """
这是一个更简洁的版本来显示标题的样子
From: Lastname, Firstname
Sent: Monday, July 15th, 2011, 9:36 AM
To: Othername, Name
Subject: blah
Importance: High
Message message message
second line of message
second para of message
From: Lastname, Firstname
Sent: Thursday, July 18th, 2011, 10:45 AM
To: Othername, Name
Subject: blahblah
message
...
我正在尝试将标头中的信息与消息本身一起正则表达式。我有一个可以成功匹配所有标题的正则表达式,但我正在努力处理这个消息。问题是,一条消息可以包含任何东西(或什么都没有)。可能有多个换行符等。我想得到所有这些,但我仍然想拆分电子邮件。我的尝试(请注意,标题的“重要”部分是可选的):
for hit in re.finditer(r'[\s\n]*From:[\s\n]*(?P<from>.*)[\s\n]*Sent:[\s\n]*(?P<date>.*)[\s\n]*To:[\s\n]*(?P<to>.*)[\s\n]*Subject:[\s\n]*(?P<subject>.*)[\s\n]*(?:Importance:)?[\s\n]*.*[\s\n]*(?P<message>(.|\n)*)', allEmailsString):
print "from: " + hit.group("from")
print "to: " + hit.group("to")
print "date: " + hit.group("date")
print "subject: " + hit.group("subject")
print "message: " + hit.group("message")
问题是,消息组正在抓住一切。因此,我正确获取了第一个电子邮件标头的 from/to/etc,然后看到一条包含该电子邮件消息的消息,以及所有后续电子邮件标头和消息。我需要抓住“直到下一个电子邮件标题/正则表达式匹配或直到字符串结尾的所有内容”。
我已经有一个解决方法 - 我可以摆脱消息捕获组并只获取标题。然后,遍历匹配对象并根据它们的开始/结束对字符串进行切片。例如,message1 是从 match1.end 到 match2.start。
所以,我问...
- 有没有办法可以通过在我的正则表达式中捕获组来做到这一点?
- 有更好的解决方法吗?