1

我在一个字符串中有一堆名字,每个名字+姓氏都位于'>'和'>'s内。因此,例如,字符串可能是,'uselessdataetc<Michael Bloomberg>blahblah<William Handler>blahblah'我希望它返回'Michael Bloomberg''William Handler'

这是我正在使用的正则表达式:

nameregex = '<([a-z]+|\s)*>'

我在使用正则表达式时使用 re.IGNORECASE。它目前只返回姓氏。所以它返回“Bloomberg”、“Handler”。

谁能明白为什么会这样?

4

3 回答 3

4

搜索:

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]+)>'
于 2013-08-12T13:06:03.383 回答
1

你可以试试

nameregex = r'<([^>]+)>'
于 2013-08-12T13:06:59.337 回答
1

简单的回答:

nameregex = r'<([^>]+)>'

在你的情况下:

>>> nameregex = re.compile(r'<([^>]+)>')
>>> nameregex.findall('uselessdataetc<Michael Bloomberg>blahblah<William Handler>blahblah')
['Michael Bloomberg', 'William Handler']

或更简单:

>>> re.findall(r'<([^>]+)>','uselessdataetc<Michael Bloomberg>blahblah<William Handler>blahblah')
['Michael Bloomberg', 'William Handler']
于 2013-08-12T13:22:21.050 回答