【问题标题】:Python re doesn't match last capture groupPython re 与最后一个捕获组不匹配
【发布时间】:2014-12-08 23:00:10
【问题描述】:

对于以下代码:

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

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

【问题讨论】:

    标签: python regex capture-group


    【解决方案1】:

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

    试试(.*)([^ ]*) 什么的

    【讨论】:

    • 感谢您的回答并澄清非贪婪匹配,但就我而言,@Simon 的回答更好。
    【解决方案2】:

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

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

    如果你使用:

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

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

    【讨论】:

      【解决方案3】:

      没有。试试这个

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

      给予:

      [('tyler', 'ryan')]
      

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          r'(.*) vs (.*)'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-10-08
            • 1970-01-01
            • 1970-01-01
            • 2018-09-17
            • 2013-06-27
            • 1970-01-01
            • 2016-09-21
            • 1970-01-01
            相关资源
            最近更新 更多