2

对于以下代码:

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')]

有没有一种方法可以在没有自定义分隔符的情况下获得我的匹配项?

4

5 回答 5

4

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

尝试(.*)([^ ]*)或某事

于 2014-12-08T23:03:40.943 回答
3

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

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

如果您使用:

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

也就是说,如果没有第二个问号,它也会捕获后面的文本vs

于 2014-12-08T23:16:42.070 回答
2

不,试试这个

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

给出:

[('tyler', 'ryan')]

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

于 2014-12-08T23:05:21.740 回答
2

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

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

您对 findall() 的使用对我来说意味着您希望必须匹配多个配对 - 如果不是,那么您可能想要使用 search() 并使用^$正则表达式特殊字符来更紧密地绑定您的搜索。

于 2014-12-08T23:07:57.917 回答
0

非贪婪?者正在阻止捕获第二个单词。这样做会更好

r'(.*) vs (.*)'
于 2014-12-09T00:03:38.723 回答