【问题标题】:Python regular expression pattern * is not working as expectedPython 正则表达式模式 * 未按预期工作
【发布时间】:2015-01-10 13:40:45
【问题描述】:

在处理Google's 2010 Python class 时,我发现了以下文档:

'*' -- 左边的模式出现 0 次或多次

但是当我尝试以下方法时

re.search(r'i*','biiiiiiiiiiiiiig').group() 

我希望 'iiiiiiiiiiiiii' 作为输出,但得到了 ''。为什么?

【问题讨论】:

标签: python regex


【解决方案1】:

* 表示 0 或更多,但 re.search 将仅返回第一个匹配项。这里第一个匹配是一个空字符串。所以你得到一个空字符串作为输出。

* 更改为+ 以获得所需的输出。

>>> re.search(r'i*','biiiiiiiiiiiiiig').group()
''
>>> re.search(r'i+','biiiiiiiiiiiiiig').group()
'iiiiiiiiiiiiii'

考虑这个例子。

>>> re.search(r'i*','biiiiiiiiiiiiiig').group()
''
>>> re.search(r'i*','iiiiiiiiiiiiiig').group()
'iiiiiiiiiiiiii'

这里i* 返回iiiiiiiiiiiiii,因为起初,正则表达式引擎尝试匹配i 的零次或多次。一旦它在第一个找到i,它就会贪婪地匹配第二个示例中的所有i,所以你得到iiiiiiii作为输出,如果i不在第一个(考虑这个biiiiiiig 字符串),i* 模式将匹配每个不匹配之前的所有空字符串,在我们的例子中,它匹配存在于bg 之前的所有空字符串。因为re.search 只返回第一个匹配,你应该得到一个空字符串,因为第一个不匹配的b

为什么我在下面的示例中输出了三个空字符串?

>>> re.findall(r'i*','biiiiiiiiiiiiiig')
['', 'iiiiiiiiiiiiii', '', '']

正如我之前解释的,对于每一个不匹配,你应该得到一个空字符串作为匹配。让我解释。正则表达式引擎从左到右解析输入。

  1. 第一个空字符串作为输出是因为模式i* 不会匹配字符b,但它匹配b 之前存在的空字符串。

  2. 现在引擎移动到下一个字符i,它将与我们的模式i*匹配,所以它贪婪地匹配下面的i。所以你得到iiiiiiiiiiiiii作为第二个。

  3. 在匹配所有i 之后,它移动到下一个字符g,它与我们的模式i* 不匹配。所以i*在不匹配g之前匹配空字符串。这就是第三个空字符串的原因。

  4. 现在我们的模式i* 匹配行尾之前存在的空字符串。这就是第四个空字符串的原因。

【讨论】:

  • 让我详细说明一下:re.search 检查模式是否在字符串 biiiiig 中的位置 0 处匹配。它确实:那里有一个零序列is。所以它返回空字符串。
  • 我知道 'i+' 给出了想要的结果。但是零更多的i意味着,更多的i在那里。为什么不回来了。第一次匹配是什么概念,这里我没有使用分组。
  • 我想我已经解释过了。 re.search(...).group() 将返回此 re.findall(r'i*','biiiiiiiiiiiiiig') 中第一个索引的值
  • @Avinash,这次对您的 findall 解释感到满意 :-)。但是我可以知道 findall 结果中的那 3 个空字符串是什么。 1. 在 bigining 2. 在字符串的末尾 我们如何得到第三个?
【解决方案2】:

试试这个

re.search(r'i+','biiiiiiiiiiiiiig').group()

希望对你有帮助。

更新:

似乎我误解了这个问题。 T_T

【讨论】:

  • 我知道 'i+' 给出了想要的结果。但是零更多的i意味着,更多的i在那里。为什么不回来了。第一次匹配是什么概念,这里我没有使用分组。
猜你喜欢
  • 2014-04-28
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多