查找具有给定名字的名字

时间:2018-07-15 07:28:02

标签: regex python-3.x

我正在miniconda3下使用Python 3.6.5。符合https://docs.python.org/3/library/re.html中给出的示例,如下所示:

m = re.search(r'(?<=-)\w+', 'spam-egg')
m.group(0)
'egg'

我想找到所有名字都叫Bob的名字。因此,我编写了以下代码:

import re
names = ['Raman Srinivasan', 'Balaji Srinivasan', 'Bob Stuart', 
         'Divya Srinivasan', 'James Ford', 'Bob Simposon', 'Bob Willis']
starts_with_bob = r'(?<=Bob)\w+'
for i in names:
    found = re.search(starts_with_bob, i)
    print(found.group(0))

但是,Jupyter抛出了错误:

     5 for i in names:
     6     found = re.search(starts_with_bob, str(i))
---->7     print(found.group(0))

AttributeError: 'NoneType' object has no attribute 'group'

然后我尝试删除原始文本指示器r,并将搜索模式更改为:

starts_with_bob = '(?<=Bob)\w+'

也给出了相同的错误。我在这里想念什么?

1 个答案:

答案 0 :(得分:2)

您的正则表达式是错误的。您的正则表达式匹配以下内容:

BobSmith
BobStamper
BobStevens

看到了吗?您的正则表达式需要额外的空间以及开始和结束锚点:

(?<=^Bob )\w+$

或者,您也可以使用此正则表达式而无需回头:

^Bob (\w+)$

并获得group(1)

您的代码中还有另一个错误。当正则表达式匹配失败时,search返回None。您需要检查None,仅当found不是None时,才打印匹配项:

import re
names = ['Raman Srinivasan', 'Balaji Srinivasan', 'Bob Stuart', 
         'Divya Srinivasan', 'James Ford', 'Bob Simposon', 'Bob Willis']
starts_with_bob = r'(?<=^Bob) \w+$'
for i in names:
    found = re.search(starts_with_bob, i)
    if found != None:
        print(found.group(0))