使用re.search()理解*(零或多个)运算符

时间:2017-11-16 05:37:25

标签: python regex regex-greedy

我是python的新手并且经历了"Google for Education" python课程

现在,下面的一行让我感到困惑:

  

* - 左侧出现0次或更多次图案

(所有示例都在python3中)

e.g。 1

In [2]: re.search(r"i*", "piiig!!").group()
Out[2]: ''

这很好,因为“pi”有1次出现所以它被撤回

e.g。 2

In [3]: re.search(r"i?", "piiig!!").group()
Out[3]: ''

为什么它实际上不会返回“我” - 根据我的理解,它应该返回“iii”。但结果是一个空字符串。

另外,“0或更多”究竟是什么意思?我在google搜索但是到处都提到* - 0或更多。但是如果有一个表达式出现0,那即使它不存在也不会成为现实吗?那么搜索有什么意义呢?

我对此非常困惑。能帮我解释一下这个问题,还是指点我正确的方向。

我希望正确的解释也能解决我的问题:

git

我已尝试过Spyder 3.2.4

中的示例

4 个答案:

答案 0 :(得分:0)

您需要正确使用*(0或更多)和+(1或更多)才能获得所需的输出

例如:1匹配,因为您已经为“i”定义*,此模式将捕获所有“p”或“pi”组合

例如:2如果您只需要匹配“i”,则需要使用“+”代替“*”。

如果您使用“*”

In: re.search(r"pi*g", "piiig!!").group()

如果你输入的是(“pig”或“piig”或“pg”)

,这将返回

如果您使用“+”

In: re.search(r"pi+g", "piiig!!").group()

如果您输入(“pig”或“piig”)

,则会返回

答案 1 :(得分:0)

特殊字符*表示前一个字符出现0次或更多次。例如。 a*与0个或多个匹配项匹配,可能是'''a''aa'等。这是因为''出现{{1} }}。 要获得a,您应该使用iii代替+,从而获得*的第一个非零序列'i'

iii

答案 2 :(得分:0)

因为''r'i*'的第一个匹配结果,'iii'是第二个匹配结果。

In [1]: import re

In [2]: re.findall(r'i*', 'piiig!!')
Out[2]: ['', 'iii', '', '', '', '']

本网站还将解释正则表达式的工作方式。 https://regex101.com/r/XVPXMv/1

答案 3 :(得分:0)

解释比我们目前看到的答案要复杂一些。

首先,与re.match()不同,原始操作re.search()检查字符串中的任何位置(这是Perl默认执行的操作)并找到模式一次:< / p>

  

扫描字符串,查找常规的第一个位置   表达式模式产生匹配,并返回相应的   MatchObject实例。如果字符串中没有位置匹配则返回None   模式;请注意,这与查找零长度不同   匹配字符串中的某个点。请参阅:Ref

如果我们在尝试查找匹配项时遵循正则表达式引擎的每一步,我们可以针对模式i*和测试字符串piigg!!观察以下内容:

RegExBuddy Debug till End Output

如您所见,第一个字符(位置0)产生匹配,因为pi的零次且结果为空匹配(而不是p - 因为我们不搜索对于p或任何其他角色) 在第二个字符(位置1),找到第二个匹配(跨越到位置2),因为ii是零{或1}}的{​​{1}} ...在第3个位置有另一个空匹配,到目前为止等等。

因为i只返回第一个匹配,所以它会粘贴在第0位的第一个空匹配。这就是为什么你得到了你所发布的(令人困惑的)结果:

re.search

为了匹配每次出现,您需要In [2]: re.search(r"i*", "piiig!!").group() Out[2]: ''

  

返回字符串中所有非重叠的模式匹配,作为列表   字符串。从左到右扫描字符串,并返回匹配项   按顺序找到。如果模式中存在一个或多个组,   返回一个组列表;如果模式,这将是一个元组列表   有不止一个团体。结果中包含空匹配   除非他们触及另一场比赛的开始。请参阅:Ref