J'ai essayé d'utiliser une expression régulière pour identifier un mot entre deux caractères et je ne peux tout simplement pas réussir. Voici mon code:

re.match(r"\s*\#?\w*(\<)+\s*(?P<method>\w+)\s*(\>)+\w*", "# This <foo> truc")

La phrase a (ou pas) un commentaire python (#) et doit montrer la méthode de groupe.

Merci pour votre temps et votre aide

0
linksse 18 mars 2019 à 19:56

2 réponses

Meilleure réponse

Vous devez modifier votre expression régulière pour inclure des espaces facultatifs avant This et <, puis vous pouvez utiliser l'attribut groups:

some_match = re.match(r"\s*\#?\s*\w*\s*(\<)+\s*(?P<method>\w+)\s*(\>)+\w*", "# This <foo> truc")

some_match.groups()
('<', 'foo', '>')

some_match.groups(1)
'foo'
0
C.Nivs 18 mars 2019 à 17:17

Vous manquez des correspondances d'espaces. Après le #, avant le < et après le >.

Une option consiste donc à ajouter les correspondances d'espaces manquants:

>>> m = re.match(r"\s*\#?\s*\w*\s*(\<)+\s*(?P<method>\w+)\s*(\>)+\s*\w*", "# This <foo> truc")
>>> m.group('method')
'foo'

Cependant, si vous n'avez besoin que de la valeur entre < et >, utilisez plutôt re.search à la place et vous pouvez simplement utiliser votre expression rationnelle de manière significative:

>>> r = re.search(r"\<(?P<method>[^\>]*)\>", "# This <foo> truc")
>>> r.group('method')
'foo'
0
Nikolas Stevenson-Molnar 18 mars 2019 à 17:18