2010-08-19 15 views
41

Sto analizzando le stringhe che potrebbero contenere un numero qualsiasi di stringhe tra virgolette (sto analizzando il codice e cercando di evitare il PLY). Voglio scoprire se una sottostringa è quotata e ho l'indice delle sottostringhe. Il mio pensiero iniziale era quello di usare re per trovare tutte le partite e quindi capire il range di indici che rappresentano.Trova gli indici di tutte le corrispondenze regolari in Python?

Sembra che dovrei usare re con un'espressione regolare come \"[^\"]+\"|'[^']+' (sto evitando di occuparmi di virgolette triple e tali stringhe al momento). Quando uso findall() ottengo un elenco delle stringhe corrispondenti, che è piuttosto carino, ma ho bisogno di indici.

La mia sottostringa potrebbe essere semplice come c e ho bisogno di capire se questo particolare c è effettivamente quotato o meno.

Grazie in anticipo.

+0

Suoni come il lavoro non adatto per regex. –

risposta

95

Questo è ciò che si vuole: (source)

re.finditer(pattern, string[, flags]) 

Ritorna un iteratore cedere casi MatchObject su tutti non sovrapposte le partite per il modello RE nella stringa. La stringa è scansionata da sinistra a destra e le corrispondenze vengono restituite nell'ordine trovato. Le partite vuote dello sono incluse nel risultato a meno che non tocchino l'inizio di un'altra corrispondenza.

È quindi possibile ottenere le posizioni di inizio e fine da MatchObjects.

ad es.

[(m.start(0), m.end(0)) for m in re.finditer(pattern, string)] 
+0

Fantastico! Funziona bene Grazie. – xitrium

+24

Nota che puoi effettivamente usare 'm.span()' per ottenere '(m.start(), m.end())' (e l'argomento di gruppo predefinito è '0', quindi può essere omesso). – Amber

+1

Brillante. Stavo cercando esattamente questo. – armandino

Problemi correlati