我在字符串中有一堆名字,每个名字和姓氏都位于'>'和'>'s之内。因此,字符串可能是例如'uselessdataetc<Michael Bloomberg>blahblah<William Handler>blahblah'
,而我希望它返回'Michael Bloomberg'
,'William Handler'
这是我正在使用的正则表达式:
nameregex = '<([a-z]+|\s)*>'
使用正则表达式时,我正在使用re.IGNORECASE。目前仅返回姓氏。因此,它返回的是“彭博”,“处理程序”。
谁能看到为什么会这样?
最佳答案
搜索:
r'<([^>]+)>'
而是找到不是结尾字符的任何东西。
演示:
>>> nameregex = re.compile(r'<([^>]+)>')
>>> nameregex.findall('uselessdataetc<Michael Bloomberg>blahblah<William Handler>blahblah')
['Michael Bloomberg', 'William Handler']
您的正则表达式在每组字母或空格周围使用捕获组,并且仅返回
<...>
尖括号内的最后一个这样的匹配项,因为即使捕获组匹配多个模式,捕获组也不会相乘。 Michael Bloomberg
是3个匹配项; (Michael)( )(Bloomberg)
,并且仅为捕获组返回最后一个这样的匹配项。您可以使用以下方法使版本工作:
nameregex = '<((?:[a-z]+|\s)*)>'
相反,或在字符类中包含空格并删除外部通配符:
nameregex = '<([a-z\s]+)>'