我正在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+'
也给出了相同的错误。我在这里想念什么?
答案 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))