黄河大鲤鱼 发表于 2020-5-24 11:52

请教正则里星号与加号的不同匹配

见图,字符串s首位是个空格,星号和加号的匹配结果不同,大神能细致讲解下吗

--------------------------------------------以下是定义--------------------------------------------*对它前面的正则式匹配0到任意次重复, 尽量多的匹配字符串。 ab* 会匹配 'a', 'ab', 或者 'a'``后面跟随任意个 ``'b'。+对它前面的正则式匹配1到任意次重复。 ab+ 会匹配 'a' 后面跟随1个以上到任意个 'b',它不会匹配 'a'。--------------------------------------------说明结束处--------------------------------------------我的理解是,使用星号*匹配,被匹配的字符串中可以没有待匹配正则式,如果有的话则尽可能多的匹配上;使用加号+匹配,被匹配的字符串中必须要有待匹配正则式,而且要尽可能多的匹配上。不知道我的理解对吗?如果我的理解正确,回到本题中,/S代表非空白字符,由于字符串s中有非空白字符:1.星号*在贪婪下尽可能多的进行匹配,结果应该是helloWorld;2.加号+在贪婪下也尽可能多的进行匹配,结果也应该是helloWorld但是运行结果却和我的理解不一样,请大神指导一下。

不苦小和尚 发表于 2020-5-24 12:00

+号是匹配0个或1个,所以就匹配了一个空
*号是尽可能多的匹配

ymhld 发表于 2020-5-24 12:23

import re
s=" helloworld"
ret=re.search(u'\S*',s)
ret1=re.search(u'\S+',s)

print('ret',ret)
print(ret1)

ret <re.Match object; span=(0, 0), match=''>
<re.Match object; span=(1, 11), match='helloworld'>
两个一个是匹配到了一个开始的“”,不是空格
第二个匹配到了helloword

ymhld 发表于 2020-5-24 12:29

import re
s=" helloworld"
ret=re.findall(u'\S*',s)
ret1=re.findall(u'\S+',s)

print('ret',ret)
print(ret1)

ret ['', 'helloworld', '']
['helloworld']
这样就知道了,第一个是三个匹配,有两个空集和一个helloworld

戰龍在野 发表于 2020-5-24 12:45

谢谢楼上的兄弟学习了

luanshils 发表于 2020-5-24 12:53

可以理解为*是贪婪的

冥界3大法王 发表于 2020-5-24 14:36

问新家点匹配;
星号家住01栋;
加号家住1+栋。
自从你亲哥编成口诀后,再也没有忘记过。
@黄河大鲤鱼

黄河大鲤鱼 发表于 2020-5-24 19:08

ymhld 发表于 2020-5-24 12:29
import re
s=" helloworld"
ret=re.findall(u'\S*',s)


结果上是如此,我想知道为什么会这样。此题中,\S*第一个为什么会匹配到'',结果为什么还有个''
我试过去掉首位空格,\S*除了匹配helloWorld还会再匹配个''
我想知道原因。

黄河大鲤鱼 发表于 2020-5-24 19:09

冥界3大法王 发表于 2020-5-24 14:36
问新家点匹配;
星号家住01栋;
加号家住1+栋。


没看懂,尴尬了。

ymhld 发表于 2020-5-24 19:11

黄河大鲤鱼 发表于 2020-5-24 19:08
结果上是如此,我想知道为什么会这样。此题中,\S*第一个为什么会匹配到'',结果为什么还有个''
我试过 ...

后面的一个应该是回车之类的\n,前一个也许是开始的符号?这个真不太清楚,不过*表示0到多个,当表示为0时,也表示空格前的空元素
页: [1] 2
查看完整版本: 请教正则里星号与加号的不同匹配