我在字符串中有一堆名字,每个名字和姓氏都位于'>'和'>'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]+)>'

10-08 01:13