我在字符串中有一堆名字,每个第一个和最后一个名字都在'&gt;'中和'&gt;'。因此,字符串可以是,例如'uselessdataetc<Michael Bloomberg>blahblah<William Handler>blahblah'
,我希望它返回'Michael Bloomberg'
,'William Handler'
这是我正在使用的正则表达式:
nameregex = '<([a-z]+|\s)*>'
使用正则表达式时我正在使用re.IGNORECASE。它目前只返回姓氏。所以它回归'彭博','汉德勒'。
有人能看出为什么会这样吗?
答案 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']