根据在线python google类,我找到了以下文档。
'*'
- 左侧出现0次以上的模式
但是,当我尝试以下操作时,它没有给出预期的结果。
我期待'iiiiiiiiiiiiii'
作为输出。但是它将''
作为输出。
我可以知道原因吗?
re.search(r'i*','biiiiiiiiiiiiiig').group()
答案 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
正如我之前解释的那样,对于每个不匹配,你应该得到一个空字符串作为匹配。让我解释。正则表达式引擎从左到右解析输入。
输出的第一个空字符串是因为模式>>> re.findall(r'i*','biiiiiiiiiiiiiig')
['', 'iiiiiiiiiiiiii', '', '']
不匹配字符i*
,但它匹配b
之前存在的空字符串。< / p>
现在引擎移动到b
的下一个字符,该字符将与我们的模式i
匹配,因此它贪婪地匹配以下i*
&#39} 。所以你得到i
作为第二个。
匹配所有iiiiiiiiiiiiii
后,它会移动到i
的下一个字符,该字符与我们的模式g
不匹配。因此i*
匹配不匹配i*
之前的空字符串。这就是第三个空字符串的原因。
现在我们的模式g
匹配在行结束之前存在的空字符串。这是第四个空字符串的原因。
答案 1 :(得分:0)
试试这个
re.search(r'i+','biiiiiiiiiiiiiig').group()
希望它有所帮助。
更新
似乎我误解了这个问题。 T_T