python正则表达式模式*未按预期工作

时间:2015-01-10 13:40:46

标签: python regex

根据在线python google类,我找到了以下文档。

'*' - 左侧出现0次以上的模式

但是,当我尝试以下操作时,它没有给出预期的结果。

我期待'iiiiiiiiiiiiii'作为输出。但是它将''作为输出。

我可以知道原因吗?

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

2 个答案:

答案 0 :(得分:12)

*表示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作为输出,如果{{1}不是第一个(考虑这个i字符串),biiiiiiig模式在每个不匹配之前匹配所有空字符串,在我们的例子中它匹配所有i*b之前存在的空字符串。由于g仅返回第一个匹配项,因此您应该获得一个空字符串,因为第一个匹配项不匹配re.search

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

b

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

  1. 输出的第一个空字符串是因为模式>>> re.findall(r'i*','biiiiiiiiiiiiiig') ['', 'iiiiiiiiiiiiii', '', ''] 不匹配字符i*,但它匹配b之前存在的空字符串。< / p>

  2. 现在引擎移动到b的下一个字符,该字符将与我们的模式i匹配,因此它贪婪地匹配以下i*&#39} 。所以你得到i作为第二个。

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

  4. 现在我们的模式g匹配在行结束之前存在的空字符串。这是第四个空字符串的原因。

答案 1 :(得分:0)

试试这个

re.search(r'i+','biiiiiiiiiiiiiig').group()
希望它有所帮助。

更新

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