Maison > Questions et réponses > le corps du texte
1.看书上教材说*?是非贪婪模式,那么对于下面这段代码,为啥结果是空呢?
>>> import re
>>> line = 'cats are smart than dogs.'
>>> m=re.match(r'(.*?)',line)
>>> m.group()
结果为:''
为什么结果为空呢?不应该是cats么?难道字符串前默认有个空字符?
新手求明白人给解答下,谢谢了
大家讲道理2017-04-17 17:29:36
.
= 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'(.*?) '
.
高洛峰2017-04-17 17:29:36
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.
高洛峰2017-04-17 17:29:36
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.
黄舟2017-04-17 17:29:36
.
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