1.看书上教材说*?是非贪婪模式,那么对于下面这段代码,为啥结果是空呢?
>>> import re >>> line = 'cats are smart than dogs.' >>> m=re.match(r'(.*?)',line) >>> m.group()
结果为:''为什么结果为空呢?不应该是cats么?难道字符串前默认有个空字符?新手求明白人给解答下,谢谢了
''
认证0级讲师
. = 任意字元* = 出現0 或多次,相當於{0,}? = 取前面比對最少的,相當於{0,1}. = 任意字符* = 出现 0 或多次,相当于 {0,}? = 取前面匹配最少的,相当于 {0,1}
.
*
{0,}
?
{0,1}
综合起来就是“任意字符出现0次“,所以就是什么都没有。
要匹配到 cats 应该利用 cats 后面的空格,r'(.*?) '
cats
r'(.*?) '
我個人理解的是,.*?匹配的是^ 就是開始的那個位置,正規表示式裡面,位置也是可以被匹配的,例如:.*?匹配的是^ 就是开始的那个位置,正则表达式里面,位置也是可以被匹配的,比如:
.*?
^
In [1]: s = 'a' In [2]: re.sub(r'^','b',s) Out[2]: 'ba'
这个例子就是替换了^ , 同理 $也一样, 所以你的.*?直接匹配了^.PS: 在使用正则的时候,尤其是文本内容比较多的时候, 不建议使用.*而是[sS]* 或者[dD]* rrreee
$
.*
[sS]*
[dD]*
這是正規表示式貪婪匹配和非貪婪匹配的區別:
貪婪模式:在能匹配的時候,匹配最長的。表達式不以?結尾。 ?结尾。
非贪婪模式:在能匹配的时候,匹配最短的。表达式以?结尾。
比如字符串abcabcabc,当我想要匹配以a开头、以c结尾的字符串时,存在三个匹配:abc、abcabc和abcabcabc,其中最长的abcabcabc可以用a.*c匹配,而最短的abc可以用a.*?c匹配。
abcabcabc
a
c
abc
abcabc
a.*c
a.*?c
>>> import re >>> line = "abcabcabc" >>> m = re.match(r'a.*c', line) >>> m.group() 'abcabcabc' >>> m = re.match(r'a.*?c', line) >>> m.group() 'abc'
为什么结果为空呢?不应该是cats么?
因为.*是贪婪模式,会匹配最长的字符串,其中每个字符都是任意字符(.),即由所有输入字符组成的字符串。而.*?是非贪婪模式,会匹配最短的字符串,其中每个字符都是任意字符(.),即空字符串。
如果想匹配 cats 这个单词,应该使用cats。如果想匹配输入字符串中的第一个单词,应该使用w+或S+。
w+
S+
>>> m=re.match(r'\w+',line) >>> m.group() 'cats' >>> m=re.match(r'\S+',line) >>> m.group() 'cats'
难道字符串前默认有个空字符?
没有,不过在正则表达式中,可以用^表示字符串的开始位置,用$表示结束位置。注意这两个字符(^和$
#🎜🎜#為什麼結果為空呢?不應該是cats麼? #🎜🎜#
#🎜🎜#難道字串前預設有個空字元? #🎜🎜#
. 邊界匹配,不消耗帶匹配字串中字符,又是非貪婪模式,所以匹配不到字串
.
= 任意字元*
= 出現0 或多次,相當於{0,}
?
= 取前面比對最少的,相當於{0,1}
.
= 任意字符*
= 出现 0 或多次,相当于{0,}
?
= 取前面匹配最少的,相当于{0,1}
综合起来就是“任意字符出现0次“,所以就是什么都没有。
要匹配到
綜合起來就是「任意字元出現0次“,所以就是什麼都沒有。 🎜 🎜要匹配到cats
应该利用cats
后面的空格,r'(.*?) '
cats
應該利用cats
後面的空格,r'(.*?) '
。 🎜我個人理解的是,
.*?
匹配的是^
就是開始的那個位置,正規表示式裡面,位置也是可以被匹配的,例如:.*?
匹配的是^
就是开始的那个位置,正则表达式里面,位置也是可以被匹配的,比如:这个例子就是替换了
這個例子就是替換了^
, 同理$
也一样, 所以你的.*?
直接匹配了^
.PS: 在使用正则的时候,尤其是文本内容比较多的时候, 不建议使用
.*
而是[sS]*
或者[dD]*
rrreee^
, 同理$
也是一樣, 所以你的.*?
直接匹配了^
.PS: 在使用正規的時候,尤其是文字內容比較多的時候, 不建議使用
.*
而是[sS]*
或[dD]*
等等#🎜🎜#這是正規表示式貪婪匹配和非貪婪匹配的區別:
貪婪模式:在能匹配的時候,匹配最長的。表達式不以
?
結尾。?
结尾。非贪婪模式:在能匹配的时候,匹配最短的。表达式以
?
结尾。比如字符串
abcabcabc
,当我想要匹配以a
开头、以c
结尾的字符串时,存在三个匹配:abc
、abcabc
和abcabcabc
,其中最长的abcabcabc
可以用a.*c
匹配,而最短的abc
可以用a.*?c
匹配。因为
.*
是贪婪模式,会匹配最长的字符串,其中每个字符都是任意字符(.
),即由所有输入字符组成的字符串。而.*?
是非贪婪模式,会匹配最短的字符串,其中每个字符都是任意字符(.
),即空字符串。如果想匹配 cats 这个单词,应该使用
cats
。如果想匹配输入字符串中的第一个单词,应该使用w+
或S+
。没有,不过在正则表达式中,可以用
#🎜🎜#非貪婪模式:在能匹配的時候,匹配#🎜🎜#最短#🎜🎜#的。表達式以^
表示字符串的开始位置,用$
表示结束位置。注意这两个字符(^
和$
?
結尾。 #🎜🎜# #🎜🎜#例如字串abcabcabc
,當我想要匹配以a
開頭、以c
結尾的字串時,有三個符合:abc
、abcabc
和abcabcabc
,其中最長的abcabcabc
可以用a.*c
匹配,而最短的abc
可以用a.*?c
匹配。 #🎜🎜# rrreee #🎜🎜#因為.*
是貪婪模式,會匹配最長的字串,其中每個字元都是任意字元(.
),即由所有輸入字符組成的字串。而.*?
是非貪婪模式,會匹配最短的字串,其中每個字元都是任意字元(.
),即空字串。 #🎜🎜# #🎜🎜#如果想匹配 cats 這個單字,應該使用cats
。如果想要符合輸入字串中的第一個單詞,應該使用w+
或S+
。 #🎜🎜# rrreee #🎜🎜#沒有,不過在正規表示式中,可以用^
表示字串的起始位置,用$
表示結束位置。注意這兩個字元(^
和$
)是符合規則規定的符號,用於你所寫的規則字串,不是說待匹配字串中包含這兩個符號。 #🎜🎜#.
邊界匹配,不消耗帶匹配字串中字符,又是非貪婪模式,所以匹配不到字串