Je suis nouveau sur python, issu d'une connaissance de base de perl. J'essaie de capturer une sous-chaîne avec regex.

>>> a='Question 73 of 2943'
>>> import re
>>> re.match("Question.*(\d+)\s+of", a).group(0)
'Question 73 of'
>>> re.match("Question.*(\d+)\s+of", a).group(1)
'3'

Ce que je voulais faire, c'était en attraper 73 dans le groupe. J'ai supposé que la parenthèse ferait cela.

1
Joel G Mathew 16 avril 2018 à 08:04

3 réponses

Meilleure réponse

.* est gourmand. Cela signifie qu'il continuera à correspondre à n'importe quel caractère (sauf pour les terminateurs de ligne) 0 fois ou plus. Cela signifie que le groupe de capture (\d+) que vous avez configuré ne se produira jamais. Ce que vous pouvez faire, c'est rendre la partie .* paresseuse en ajoutant un ? pour que votre expression rationnelle ressemble à ...

re.match(r"Question.*?(\d+)\s+of", a)

La différence entre regex paresseux et gourmand est bien expliquée ici

1
rsiemens 16 avril 2018 à 05:19

Votre partie. * Capturera tout caractère comprenant un chiffre. Mieux vaut utiliser except.

Question[^\d]*(\d+)\s+of

Cela devrait vous donner 73

0
digitake 16 avril 2018 à 05:10

Si vous souhaitez capturer uniquement 73, vous pouvez le faire re.search(r'\d+', a).group() qui arrête la recherche d'une correspondance après avoir trouvé la première correspondance.

0
Nuruddin Iminokhunov 16 avril 2018 à 05:09