Frage Python Regex - Wie man Positionen und Werte von Übereinstimmungen erhält


Wie kann ich die Start - und Endpositionen aller Spiele mit Hilfe der re Modul? Zum Beispiel angesichts des Musters r'[a-z]' und die Schnur 'a1b2c3d4' Ich würde die Positionen bekommen wollen, wo es jeden Buchstaben findet. Im Idealfall möchte ich auch den Text des Spiels zurückbekommen.


75
2017-10-30 14:04


Ursprung


Antworten:


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

98
2017-10-30 14:15



Genommen von

Regulärer Ausdruck HOWTO

span () gibt sowohl Start- als auch Endindizes in einem einzelnen Tupel zurück. Seit der   Die Match-Methode überprüft nur, ob der RE am Anfang eines Strings übereinstimmt.   start () wird immer Null sein. Die Suchmethode von RegexObject   Instanzen durchsucht die Zeichenfolge, sodass die Übereinstimmung möglicherweise nicht bei Null beginnt   In diesem Fall.

>>> 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 Methode finditer () verfügbar, die eine Sequenz 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

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

37
2017-10-30 14:16



Für Python 3.x

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

Du sollst bekommen \n getrennte Tupel (jeweils bestehend aus ersten und letzten Indizes der Übereinstimmung) und die Übereinstimmung selbst für jeden Treffer in der Kette.


9
2017-07-05 13:08