Python Regex - Come ottenere posizioni e valori di corrispondenze


112

Come posso ottenere le posizioni di inizio e fine di tutte le partite utilizzando il remodulo? Ad esempio, dato il modello r'[a-z]'e la stringa, 'a1b2c3d4'vorrei ottenere le posizioni in cui trova ogni lettera. Idealmente, vorrei riavere anche il testo della partita.


Verifica se questo aiuta ad
abbinare gli

Risposte:


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

3
Questo non fornisce l'indice di altri gruppi in un'espressione regolare della partita = r '([az]) (0-9)' m.start sarà per il gruppo (), non per il gruppo (1)
StevenWernerCS

@StevenWernerCS start()potrebbe accettare un numero di gruppo, quindi se vuoi un indice dell'ennesimo gruppo, usastart(n)
Hi-Angel

@ ciao-angelo sì, guarda la mia risposta di seguito dell'anno scorso che fa proprio questo
StevenWernerCS

51

Preso da

Regular Expression HOWTO

span () restituisce gli indici di inizio e di fine in una singola tupla. Poiché il metodo match controlla solo se la RE corrisponde all'inizio di una stringa, start () sarà sempre zero. Tuttavia, il metodo di ricerca delle istanze RegexObject esegue la scansione della stringa, quindi in tal caso la corrispondenza potrebbe non iniziare da zero.

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

Combinalo con:

In Python 2.2, è disponibile anche il metodo finditer (), che restituisce una sequenza di istanze MatchObject come iteratore.

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

dovresti essere in grado di fare qualcosa nell'ordine di

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

Puoi usarlo come re.search(r'abbit', "has abbit of carrot").span(0)-(4, 9)
Константин Ван

L '"indice di fine" restituito da span()è come lo "stop" nella notazione slice di Python in quanto sale a ma non include quell'indice; vedere qui .
Wayne

20

Per Python 3.x

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

Otterrai \ntuple separate (che comprendono rispettivamente il primo e l'ultimo indice della corrispondenza) e la corrispondenza stessa, per ogni risultato nella stringa.


2

nota che lo span e il gruppo sono indicizzati per i gruppi di acquisizione multipla in un'espressione regolare

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

1
Grazie, questo si è rivelato super utile e sembra essere abbastanza sepolto. Inoltre, nel caso in cui qualcuno ne abbia bisogno: quando si usano i gruppi di cattura denominati, si può trovare l'indice di un gruppo usando <match> .re.groupindex, e da lì trovare lo span corrispondente usando l'approccio che hai delineato
madimov

da dove 4viene?
Radiocontrollato il

@RadioControlled number_of_known_groups_in_the_regex + 1, poiché l'intervallo è [inizio, fine) escluso la fine
StevenWernerCS

@StevenWernerCS in modo da non generalizzare i casi in cui il numero di gruppi non è noto ...
Radio Controlled
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.