我正在尝试从一大块文本(实际上来自电子邮件正文)中删除名称,这些名称通常与此类似:
From: aaa@aaa.com
CC: John Smith <aaa@aaa.com>, Charles <aaa@aaa.com>, Mary Lamb <aaa@aaa.com>, Chino <aaa@aaa.com>, Claudia <aaa@aaa.com>, <aaa@aaa.com>, <bbb@bbb.com>, John <aaa@aaa.com>
Hi there AAA! Hope you had a wonderful time
Best,
AAA
我想最终得到一个列表变量,它只包含CC上每个人的名字(第一个和最后一个,如果有的话),丢弃其余的信息。使用正则表达式的简单而干净的方法是什么? (这不是一个测试,它是一个真正的应用程序,我正在努力,我被困...)。我已经能够使用re.findall()提取所有电子邮件,其中包含我找到的电子邮件匹配模式。
谢谢
答案 0 :(得分:3)
您可以使用此正则表达式:
[:,] ([\w ]+) \<
>>> p = re.compile(ur'[:,] ([\w ]+) \<')
>>> m = re.findall(p, text)
>>> print m
['John Smith', 'Charles', 'Mary Lamb', 'Chino', 'Claudia', 'John']
答案 1 :(得分:1)
您可以尝试下面的内容。
>>> import re
>>> s = """From: aaa@aaa.com
... CC: John Smith <aaa@aaa.com>, Charles <aaa@aaa.com>, Mary Lamb <aaa@aaa.com>, Chino <aaa@aaa.com>, Claudia <aaa@aaa.com>, <aaa@aaa.com>, <bbb@bbb.com>, John <aaa@aaa.com>
... Hi there AAA! Hope you had a wonderful time
... Best,
... AAA"""
>>> re.findall(r'(?<=[:,]\s)[A-Z][a-z]+(?:\s[A-Z][a-z]+)?(?=\s<)', s)
['John Smith', 'Charles', 'Mary Lamb', 'Chino', 'Claudia', 'John']
答案 2 :(得分:0)
使用正则表达式:
re.findall("(?:CC: |, )([\w ]*) <\S*@\S*>", str)
答案 3 :(得分:0)
这将严格捕捉您的需求。
[:,]\s((?:(?![:,<]).)*)\s\<
使用第1组获取文本。