recherche

Maison  >  Questions et réponses  >  le corps du texte

python中正则表达式*?的一个问题

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

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

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

PHP中文网PHP中文网2827 Il y a quelques jours755

répondre à tous(4)je répondrai

  • 大家讲道理

    大家讲道理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'(.*?) '.

    répondre
    0
  • 高洛峰

    高洛峰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.

    répondre
    0
  • 高洛峰

    高洛峰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.

    répondre
    0
  • 黄舟

    黄舟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

    ne peut pas être mise en correspondance.

    répondre
    0
  • Annulerrépondre