Python正则表达式:查找名字和姓氏

时间:2013-08-12 13:04:26

标签: python regex

我在字符串中有一堆名字,每个第一个和最后一个名字都在'&gt;'中和'&gt;'。因此,字符串可以是,例如'uselessdataetc<Michael Bloomberg>blahblah<William Handler>blahblah',我希望它返回'Michael Bloomberg''William Handler'

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

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

使用正则表达式时我正在使用re.IGNORECASE。它目前只返回姓氏。所以它回归'彭博','汉德勒'。

有人能看出为什么会这样吗?

3 个答案:

答案 0 :(得分:4)

搜索:

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

而是找到任何结束字符的内容。

演示:

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

您的正则表达式使用围绕每组字母空格的捕获组,并且仅返回{em> last 在<...>尖括号内的匹配,因为即使匹配多个模式,捕获组也不会成倍增加。 Michael Bloomberg是3场比赛; (Michael)( )(Bloomberg)仅为捕获组返回最后一次匹配。

您可以使用以下方式使您的版本正常工作:

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

,或者在字符类中包含空格并删除外部通配符:

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

答案 1 :(得分:1)

你可以尝试

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

答案 2 :(得分: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']