我是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
中的示例答案 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!!
观察以下内容:
如您所见,第一个字符(位置0)产生匹配,因为p
为i
的零次且结果为空匹配(而不是p - 因为我们不搜索对于p或任何其他角色)
在第二个字符(位置1),找到第二个匹配(跨越到位置2),因为ii
是零{或1}}的{{1}} ...在第3个位置有另一个空匹配,到目前为止等等。
因为i
只返回第一个匹配,所以它会粘贴在第0位的第一个空匹配。这就是为什么你得到了你所发布的(令人困惑的)结果:
re.search
为了匹配每次出现,您需要In [2]: re.search(r"i*", "piiig!!").group()
Out[2]: ''
:
返回字符串中所有非重叠的模式匹配,作为列表 字符串。从左到右扫描字符串,并返回匹配项 按顺序找到。如果模式中存在一个或多个组, 返回一个组列表;如果模式,这将是一个元组列表 有不止一个团体。结果中包含空匹配 除非他们触及另一场比赛的开始。请参阅:Ref。