以下代码:
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')]
有没有办法让我的比赛没有自定义分隔符?
答案 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 (.*)'