0
votes

Python Regex fonctionne sans groupe optionnel, mais casse avec un groupe optionnel

donné une entrée: xxx pré>

et une regex: p>

regex = re.compile(r'\s*(?P<command>.*?)(/[/*])?')


1 commentaires

\ s * peut correspondre à l'espace de tête, puis . *? (Votre «commande» groupe) peut correspondre à une chaîne vide. De manière générale, un match non gourmand doit avoir quelque chose non-facultatif après elle, ou il ne correspond à rien du tout.


3 Réponses :


1
votes

regex.search () trouvera la première sous-chaîne de match. Vous pouvez utiliser regex.findall () dans ce cas.

regex.Search () Docs a déclaré:

S'il y a plus d'une correspondance, seule la première occurrence du match sera renvoyée

parce que / [/ *] facultatif, il n'a aucune contrainte pour correspondre au caractère / . Donc, cela peut même faire correspondre le premier espace, il peut correspondre à n'importe quelle partie.

Vous pouvez vérifier cette expression régulière en ligne dans REGEX101 . Vous pouvez trouver son processus et ses résultats.


0 commentaires

1
votes

Peut-être que ce n'est pas la réponse que vous recherchez, mais cela peut aider:

('say hi ', ' comment')


0 commentaires

0
votes

dans l'exemple ci-dessus, ? p . *? code> Utilisez les qualificateurs non gourmands * ?, + ?, ?? ou {m, ou {m, n}? texte aussi possible. Voir gourmand contre non gourmand pour plus Détails

et depuis le (/ [/ *])? CODE> est facultatif, la commande la commande forte> pourrait ne rien correspondre. p>

si vous voulez Pour réégifier une ligne sans commentaire, utilisez le suivant P>

" say hi /* comment"
" say hi ..."


0 commentaires