如何从文本块中提取所有名称

时间:2014-10-25 04:31:10

标签: python regex

我正在尝试从一大块文本(实际上来自电子邮件正文)中删除名称,这些名称通常与此类似:

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()提取所有电子邮件,其中包含我找到的电子邮件匹配模式。

谢谢

4 个答案:

答案 0 :(得分:3)

您可以使用此正则表达式:

[:,] ([\w ]+) \<

RegEx Demo


>>> 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组获取文本。