【问题标题】:Non-greedy mode in re.search() does not match to end of stringre.search() 中的非贪婪模式与字符串结尾不匹配
【发布时间】:2015-05-29 18:52:40
【问题描述】:

我正在尝试像这样解析 cookie 的值:

import re
m = re.search("(.*?)=(.*?); path=(.*?); domain=(.*?)", "name=value1; path=/; domain=my.domain.com")
print (m.group(0))

我得到的结果是这样的:

name=value1; path=/; domain=

我的问题是:为什么它在最后一个非贪婪位置不匹配?预期结果是:

name=value1; path=/; domain=my.domain.com

当然,我可以更改为贪婪模式或使用行尾字符 ($),但我想了解它为什么不像我预期的那样工作:)

【问题讨论】:

  • 什么是“非贪心头寸”?
  • 我不知道怎么称呼它。最后一个非贪婪组?我想这很清楚是什么意思,不是吗?

标签: python regex non-greedy


【解决方案1】:

非贪婪意味着它会尽可能少地匹配,同时仍然允许整个匹配成功。 * 表示“零个或多个”。所以它至少可以匹配为零。所以它匹配零并且匹配成功。

您的正则表达式中出现的其他 .*? 不能匹配零,因为这样整个正则表达式将无法匹配。

【讨论】:

    【解决方案2】:

    您的最后一个 (.*?) 匹配尽可能少的字符。要匹配 cookie 的其余部分,您必须设置前瞻,或匹配已知字符。

    这是一个前瞻解决方案:

    (.*?)=(.*?); path=(.*?); domain=(.*?)(?=;\s|$)
    

    demo

    顺便说一句,regex101 非常有助于了解正则表达式背后的要点:转到 regex 调试器 并单击右侧的 +,您会看到当您的正则表达式到达最后一个(.*?)时,就会发生这种情况:

    所以,这就是我一开始所说的:尽可能少地匹配。它在= 符号之后匹配一个空字符串,其余的可以“放弃”,因为这是lazy matching 所做的。

    正则表达式中的标准量词是贪心的,意思是 他们尽可能地匹配,只在必要时回馈匹配 正则表达式的其余部分。

    通过使用惰性量词,表达式尝试最小匹配 首先。

    【讨论】:

      【解决方案3】:

      其他答案很好地解释了为什么您的代码不能按原样工作。我只想指出,老实说,您可能应该贪婪地匹配非空格字符,而不是非贪婪地匹配所有字符。

      re_obj = re.compile(r"""
          (\S*)=(\S*);\s*           # capture unknown key/value pair
          path=(\S*);\s*            # capture path
          domain=(\S*)              # capture domain""", re.X)
      

      演示

      >>> result = re_obj.search("name=value1; path=/; domain=my.domain.com")
      >>> result.groups()
      ('name', 'value1', '/', 'my.domain.com')
      

      更重要的是,这似乎比字符串操作更容易实现

      txt = "name=value1; path=/; domain=my.domain.com"
      parameters = {key.strip(): value.strip() for parm in txt.split(';') for
                    key,value in (parm.strip().split('='),)}
      

      【讨论】:

      • 你是对的。我正在修复其他人的代码并尝试将更改保持在最低限度。
      猜你喜欢
      • 2013-06-09
      • 2011-05-15
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 2014-07-06
      相关资源
      最近更新 更多