Je veux écrire une expression régulière qui correspondra si la chaîne commence par "PR-\d+", mais que la chaîne se termine ou que le caractère suivant est un trait d'union. Ainsi, par exemple, ce qui suit correspondrait:

PR-123
PR-123-foo

Mais ce qui suit ne serait pas:

PR-123a
PR-
PR-foo

J'ai essayé re.match(r'PR-\d+[-$]', st), mais cela n'a pas fonctionné. Il semble que ce soit la recherche du caractère littéral du signe dollar, plutôt que la fin de la chaîne.

Comment puis-je écrire cette expression?

2
ewok 13 avril 2018 à 23:59

3 réponses

Meilleure réponse

Un signe dollar à l'intérieur d'une classe de caractères est analysé comme un caractère $ littéral. Vous devez utiliser un groupe d'alternance ou une anticipation positive.

Voici une version avec un groupe non capturant:

re.match(r'PR-\d+(?:-|$)', st) 

Voir la démo regex.

Une version d'anticipation positive:

re.match(r'PR-\d+(?=-|$)', st)

Ou la solution d'anticipation négative fonctionnant de manière identique couplée à une classe de caractères inversée (afin d'éviter l'alternance et de rendre le modèle un tout petit peu plus efficace ):

re.match(r'PR-\d+(?![^-])', st)

La seule différence est ce que ces correspondances regex renvoient: la version de groupe non capturante renverra réellement le - dans le cadre de la valeur de correspondance, et la seconde ne contiendra pas ce caractère -. Il n'y a aucune différence si vous cherchez juste un match.

Et juste FYI: re.match ne recherchera qu'une correspondance au début de la chaîne, c'est pourquoi il n'est pas nécessaire d'utiliser ^ au début du modèle. Sinon, si vous deviez utiliser re.search ou d'autres méthodes non d'ancrage, vous devrez ajouter le motif avec des ancres ^ ou \A qui correspondent au début de la chaîne.

2
Wiktor Stribiżew 14 avril 2018 à 10:41

Vous pouvez utiliser une double négation avec une anticipation négative et une classe de caractères négatifs:

re.match(r'PR-\d+(?![^-])', st)

En anglais simple: non suivi d'un caractère qui n'est pas un trait d'union.

Cette description gère les deux cas: suivi d'un trait d'union ou suivi de la fin de la chaîne.

démo

3
Casimir et Hippolyte 13 avril 2018 à 21:20

r"PR-\d+[-\w+]*$" Ça marche, je l'ai testé

-2
Geancarlo Murillo 13 avril 2018 à 21:18