首页 > 解决方案 > 查找具有给定名字的名字

问题描述

我在 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+'

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

标签: regexpython-3.x

解决方案


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

BobSmith
BobStamper
BobStevens

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

(?<=^Bob )\w+$

或者,您可以使用此正则表达式而无需后视:

^Bob (\w+)$

并得到group(1)

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

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))

推荐阅读