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

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

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

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

PHP中文网
PHP中文网

认证0级讲师

répondre à tous(4)
大家讲道理

. = n'importe quel caractère
* = apparaît 0 fois ou plus, équivalent à {0,}
? = prend celui avec le moins de correspondances précédentes, équivalent à {0,1}

Pour résumer, cela signifie "n'importe quel caractère apparaît 0 fois", donc il n'y a rien.

Pour faire correspondre cats, vous devez utiliser l'espace après cats, r'(.*?) '.

小葫芦

Ma compréhension personnelle est que .*? correspond à ^, qui est la position de départ. Dans les expressions régulières, la position peut également être mise en correspondance, comme :

.
In [1]: s = 'a'
In [2]: re.sub(r'^','b',s)
Out[2]: 'ba'

Cet exemple remplace ^, et il en va de même pour $, donc votre .*? correspond directement à ^.
PS : lorsque vous utilisez des expressions régulières, surtout s'il y a beaucoup de contenu textuel, il il n'est pas recommandé d'utiliser .* mais [sS]* ou [dD]* etc.

小葫芦

Voici la différence entre la correspondance gourmande d'expression régulière et la correspondance non gourmande :

  • Mode gourmand : Lorsque la correspondance est possible, faites correspondre le le plus long . L'expression ne se termine pas par ?.

  • Mode non gourmand : Lorsque la correspondance est possible, faites correspondre le le plus court . Les expressions se terminent par ?.

Par exemple, la chaîne abcabcabc, lorsque je veux faire correspondre une chaîne commençant par a et se terminant par c, il y a trois correspondances : abc, abcabc et abcabcabc, parmi lesquelles le abcabcabc le plus long peut être associé à a.*c, tandis que le abc le plus court peut être associé à 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'

Pourquoi le résultat est-il vide ? Ne devrait-il pas s'agir de chats ?

Comme .* est un modèle gourmand, il correspondra à la chaîne la plus longue dans laquelle chaque caractère est n'importe quel caractère (.), c'est-à-dire une chaîne composée de tous les caractères saisis. Et .*? est un mode non gourmand, qui correspondra à la chaîne la plus courte dans laquelle chaque caractère est n'importe quel caractère (.), c'est-à-dire une chaîne vide.

Si vous souhaitez faire correspondre le mot chats, vous devez utiliser cats. Si vous souhaitez faire correspondre le premier mot de la chaîne d'entrée, vous devez utiliser w ou S .

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

Y a-t-il un caractère nul avant la chaîne par défaut ?

Non, mais dans les expressions régulières, vous pouvez utiliser ^ pour représenter la position de départ d'une chaîne et $ pour représenter la position de fin. Notez que ces deux caractères (^ et $) sont des symboles spécifiés par les règles de correspondance et sont utilisés dans la chaîne de règle que vous écrivez. Cela ne signifie pas que la chaîne à mettre en correspondance contient ces deux symboles.

黄舟

. La correspondance des limites ne consomme pas les caractères de la chaîne correspondante, et il s'agit d'un mode non gourmand, donc la chaîne

ne peut pas être mise en correspondance.
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal