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