it-swarm.com.de

Python Regex - Abrufen von Positionen und Werten von Übereinstimmungen

Wie kann ich mit dem Modul re die Start- und Endpositionen aller Übereinstimmungen ermitteln? Zum Beispiel mit dem Muster r'[a-z]' und die Zeichenfolge 'a1b2c3d4' Ich möchte die Positionen bekommen, an denen es jeden Buchstaben findet. Im Idealfall möchte ich den Text des Spiels auch zurückbekommen.

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

Genommen von

Regular Expression HOWTO

span () gibt sowohl den Start- als auch den Endindex in einem einzelnen Tupel zurück. Da die Übereinstimmungsmethode nur prüft, ob die RE am Anfang eines Strings übereinstimmt, ist start () immer Null. Die Suchmethode von RegexObject-Instanzen durchsucht jedoch die Zeichenfolge, sodass die Übereinstimmung in diesem Fall möglicherweise nicht bei Null beginnt.

>>> 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)

Kombiniere das mit:

In Python 2.2 ist auch die finditer () -Methode verfügbar, die eine Folge von MatchObject-Instanzen als Iterator zurückgibt.

>>> 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)

sie sollten in der Lage sein, etwas in der Größenordnung von zu tun

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

Für Python 3.x

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

Du sollst \n getrennte Tupel (die jeweils den ersten und den letzten Index der Übereinstimmung enthalten) und die Übereinstimmung selbst für jeden Treffer in der Zeichenfolge.

17
Rams Here

beachten Sie, dass die Bereiche und Gruppen für mehrere Erfassungsgruppen in einem regulären Ausdruck indiziert sind

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