python中正则表达式*?的一个问题
PHP中文网
PHP中文网 2017-04-17 17:27:36
0
4
627

1.看书上教材说*?是非贪婪模式,那么对于下面这段代码,为啥结果是空呢?

>>> import re
>>> line = 'cats are smart than dogs.'
>>> m=re.match(r'(.*?)',line)
>>> m.group()

结果为:''
为什么结果为空呢?不应该是cats么?难道字符串前默认有个空字符?
新手求明白人给解答下,谢谢了

PHP中文网
PHP中文网

认证0级讲师

répondre à tous(4)
小葫芦

这是正则表达式贪婪匹配和非贪婪匹配的区别:

  • 贪婪模式:在能匹配的时候,匹配最长的。表达式不以?结尾。

  • 非贪婪模式:在能匹配的时候,匹配最短的。表达式以?结尾。

比如字符串abcabcabc,当我想要匹配以a开头、以c结尾的字符串时,存在三个匹配:abcabcabcabcabcabc,其中最长的abcabcabc可以用a.*c匹配,而最短的abc可以用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+

>>> m=re.match(r'\w+',line)
>>> m.group()
'cats'
>>> m=re.match(r'\S+',line)
>>> m.group()
'cats'

难道字符串前默认有个空字符?

没有,不过在正则表达式中,可以用^表示字符串的开始位置,用$表示结束位置。注意这两个字符(^$)是匹配规则规定的符号,用于你所写的规则字符串,不是说待匹配字符串中包含这两个符号。

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!