1
votes

Regex en python pour gérer "-"

Je recherche une expression régulière qui correspond au code prêt-à-travailler , prêt-à-travailler-aujourd'hui , prêt-à-fonctionner >. J'ai placé les multiples options de cette manière:

text=''' ready-to-work ready-to ready-to-work-today'''

re.findall(r'\b[a-zA-Z0-9]+?-[a-zA-Z0-9]+?-[a-zA-Z0-9]+?\b', text)

J'ai réussi à trouver des expressions de trois termes maximum, tels que ['ready-to-work'] code> mais je ne peux pas capturer ready-to et ready-to-work-today . J'attends ['ready-to-work','ready-to','ready-to-work-today'letter.

Merci pour l'aide. P >


2 commentaires

Qu'en est-il de r '[\ w -] +' ou doit-il y avoir au moins un - ?


Votre spécification est plutôt imprécise. À quoi voulez-vous qu'il corresponde exactement?


3 Réponses :


2
votes

Essayez cette expression régulière \ b \ w + (- \ w +) + \ b .


2 commentaires

Merci, mais j'ai trouvé: ['-work', '-to', '-today'] ... c'est le dernier mot de chaque terme. D'après ce que vous proposez, j'ai fait: re.findall (r '\ b (\ w + [\ - \ w +] +) \ b', texte). Cela jette le résultat que je recherchais. Merci.


Le regex fonctionne très bien, c'est juste que vous ne sortez que match.group (1) . Ajoutez une autre paire de parenthèses autour de l'expression régulière entière, ou retirez simplement la correspondance complète.



0
votes

Si vous voulez faire correspondre le trait d'union et la classe de caractères 1 à 3 fois, vous pouvez utiliser un groupe non capturant avec un quantificateur {1,3} . Pour les faire correspondre une fois ou plus, utilisez plutôt un + .

\b[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+){1,3}\b
  • \ b Limite de mot
  • [a-zA-Z0-9] + Correspond à l'une des 1+ fois répertoriées
  • (?: Groupe sans capture
    • - [a-zA-Z0-9] + correspond à - et 1 fois ou plus l'un des éléments répertoriés
  • ) {1,3} Fermez le groupe sans capture et répétez 1 à 3 fois
  • \ b Limite de mot

Démo Regex


0 commentaires

0
votes

Je suppose que cette expression pourrait renvoyer la sortie souhaitée:

['ready-to-work', 'ready-to-work-today', 'ready-to', 'ready-to-work', 'ready-to', 'ready-to-work-today', 'ready-to', 'ready-to-work-todayready-to', 'ready-to-work-today']

Test avec re.findall

import re

regex = r"\b(?:\w+-\w+(?:[\w-])*)\b"

test_str = "ready-to-work ready-to-work-today ready-to ready-to-work ready-to ready-to-work-today ready-to ready-to-work-todayready-to ready-to-work-today"

print(re.findall(regex, test_str))


0 commentaires