web-dev-qa-db-fra.com

Python Regex - Comment obtenir les positions et les valeurs de correspondances

Comment obtenir les positions de début et de fin de toutes les correspondances à l'aide du module re? Par exemple, étant donné le motif r'[a-z]' et la chaîne 'a1b2c3d4' Je voudrais connaître les positions où chaque lettre est trouvée. Idéalement, j'aimerais également obtenir le texte du match.

94
Greg
import re
p = re.compile("[a-z]")
for m in p.finditer('a1b2c3d4'):
    print(m.start(), m.group())
123
Peter Hoffmann

Pris à partir de

Guide des expressions rationnelles

span () renvoie les index de début et de fin dans un seul Tuple. Puisque la méthode de correspondance ne vérifie que si le RE correspond au début d'une chaîne, start () sera toujours zéro. Toutefois, la méthode de recherche des occurrences RegexObject analyse la chaîne, de sorte que la correspondance ne peut pas commencer à zéro dans ce cas.

>>> p = re.compile('[a-z]+')
>>> print p.match('::: message')
None
>>> m = p.search('::: message') ; print m
<re.MatchObject instance at 80c9650>
>>> m.group()
'message'
>>> m.span()
(4, 11)

Combinez cela avec:

Dans Python 2.2, la méthode finditer () est également disponible et renvoie une séquence d'occurrences MatchObject en tant qu'itérateur.

>>> p = re.compile( ... )
>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator
<callable-iterator object at 0x401833ac>
>>> for match in iterator:
...     print match.span()
...
(0, 2)
(22, 24)
(29, 31)

vous devriez pouvoir faire quelque chose de l'ordre de

for match in re.finditer(r'[a-z]', 'a1b2c3d4'):
   print match.span()
47
gone

Pour Python 3.x

from re import finditer
for match in finditer("pattern", "string"):
    print(match.span(), match.group())

Vous obtiendrez \n tuples séparés (comprenant le premier et le dernier index de la correspondance, respectivement) et la correspondance elle-même, pour chaque résultat de la chaîne.

17
Rams Here

notez que le span et le groupe sont indexés pour des groupes de capture multiples dans une expression rationnelle

regex_with_3_groups=r"([a-z])([0-9]+)([A-Z])"
for match in re.finditer(regex_with_3_groups, string):
    for idx in range(0, 4):
        print(match.span(idx), match.group(idx))
0
StevenWernerCS