【发布时间】:2021-01-11 11:02:01
【问题描述】:
考虑以下字符串
text2 = '''
Mr. Schafer
Mr Smith
Ms Davis
Mrs. Robinson
Mr. T
'''
我希望正则表达式匹配全名,如“Mr.以谢弗为例
使用 finditer():
matches = re.finditer(r'(Mr|Ms|Mrs)\.?\s[A-Z]\w*', text2)
for match in matches:
print(match)
结果:
<_sre.SRE_Match object; span=(1, 12), match='Mr. Schafer'>
<_sre.SRE_Match object; span=(13, 21), match='Mr Smith'>
<_sre.SRE_Match object; span=(22, 30), match='Ms Davis'>
<_sre.SRE_Match object; span=(31, 44), match='Mrs. Robinson'>
<_sre.SRE_Match object; span=(45, 50), match='Mr. T'>
finditer() 给了我想要的结果,但不在列表中。
但是当我使用 findall() 时:
re.findall(r'(Mr|Ms|Mrs)\.?\s[A-Z]\w*', text2)
结果:
['Mr', 'Mr', 'Ms', 'Mrs', 'Mr']
这是为什么呢?如何使用 findall() 获得我想要的结果
我想要这个结果:
['Mr. Schafer', 'Mr Smith', 'Ms Davis', 'Mrs. Robinson', 'Mr. T']
【问题讨论】:
-
您需要使组不捕获:
re.findall(r'(?:Mr|Ms|Mrs)\.?\s[A-Z]\w*', text2),否则它将返回捕获的组而不是整个匹配的模式。 -
我更喜欢
finditer而不是findall因为 iter 不会将整个数据读取到 RAM,因为它返回一个迭代,而 find all 返回一个列表。要获取值,只需使用.group()。请参阅下面的示例。
标签: python regex text regex-group