Python re与上一个捕获组不匹配

时间:2014-12-08 23:00:10

标签: python regex capture-group

以下代码:

t1 = 'tyler vs ryan'
p1 = re.compile('(.*?) vs (.*?)')
print p1.findall(t1)

输出是:

[('tyler', '')]

但我会预料到这一点:

[('tyler', 'ryan')]

我发现如果我添加分隔符,我可以让它工作:

t2 = 'tyler vs ryan!'               # Notice the exclamation mark
p2 = re.compile('(.*?) vs (.*?)!')  # Notice the exclamation mark
print p2.findall(t2)

输出:

[('tyler', 'ryan')]

有没有办法让我的比赛没有自定义分隔符?

5 个答案:

答案 0 :(得分:4)

(.*?)非贪婪,它会匹配最小的空字符串(至少在vs之后)

尝试(.*)([^ ]*)或其他

答案 1 :(得分:3)

正则表达式捕获它可以的最短字符串;这就是问号所代表的含义。因此,只要它捕获了文本vs,它就会捕获一个空字符串,然后停止。这就是它的样子:

直接链接:https://regex101.com/r/hO4lM7/2

如果您使用:

re.compile('(.*?) vs (.*)')

即没有第二个问号,它也会在vs之后捕获文本。

答案 2 :(得分:2)

没有。试试这个

t1 = 'tyler vs ryan'
p1 = re.compile('(.*?) vs (.*?)$') 
print p1.findall(t1)

给出:

[('tyler', 'ryan')]

$ - 匹配字符串的结尾或在字符串末尾的换行符之前,并且在MULTILINE模式下也匹配换行符。

答案 3 :(得分:2)

如果您确信单名战斗员,您可以使用正则表达式:

r'\s*(\S+)\s*vs\s*(\S+)\s*'

您对findall()的使用意味着我预计必须匹配多个配对 - 如果没有,那么您可能希望使用search()并使用^和{{1}正则表达式特殊字符可以更紧密地绑定您的搜索。

答案 4 :(得分:0)

非贪婪的?阻止捕获第二个单词。

会更好
r'(.*) vs (.*)'