2013-04-25 9 views
7

Ho un oggetto match regolare in Python. Voglio ottenere il testo che corrisponde. Dire se il modello è '1.3' e la stringa di ricerca è 'abc123xyz', voglio ottenere '123'. Come lo posso fare?Python: Ottenere il testo di una corrispondenza Regex

So che posso usare match.string[match.start():match.end()], ma trovo che sia piuttosto ingombrante (e in alcuni casi dispendioso) per una query di base.

C'è un modo più semplice?

+0

[ 're.finditer() '] (http://docs.python.org/2/library/re.html) – Elazar

+1

@Elazar a giudicare dalla domanda, l'OP sa come ottenere' MatchObject's, ma non come ottenere facilmente i loro contenuti. –

risposta

7

si può semplicemente utilizzare la funzione dell'oggetto partita group, come:

match = re.search(r"1.3", "abc123xyz") 
if match: 
    doSomethingWith(match.group(0)) 

per ottenere l'intera partita. MODIFICA:, come indicato dal punto 435, puoi anche omettere lo 0 e chiamare semplicemente match.group().

nota Addtional: se il modello contiene parentesi, si può anche ottenere questi submatches, passando 1, 2 e così via per group().

+0

A mio parere non intuitivo ... Ma immagino che sia il migliore che Python fornisce. –

+0

@RamRachum Non penso sia troppo strano. Quando esegui regex le sostituzioni fai riferimento ai gruppi di cattura con '\ 1',' \ 2' e così via (o '$ 1',' $ 2', a seconda dell'implementazione), e l'intera corrispondenza viene spesso indicata usando ' \ 0' (o '$ 0'). Quindi è coerente con quella numerazione di gruppi. –

+1

Puoi omettere '0', solo' match.group() '. – georg

-1

è necessario mettere l'espressione regolare dentro "()" per essere in grado di ottenere quella parte

>>> var = 'abc123xyz' 
>>> exp = re.compile(".*(1.3).*") 
>>> exp.match(var) 
<_sre.SRE_Match object at 0x691738> 
>>> exp.match(var).groups() 
('123',) 
>>> exp.match(var).group(0) 
'abc123xyz' 
>>> exp.match(var).group(1) 
'123' 

altrimenti non restituirà nulla:

>>> var = 'abc123xyz' 
>>> exp = re.compile("1.3") 
>>> print exp.match(var) 
None 
+1

Non penso che usare '. * (...). *' Per le corrispondenze di sottostringa è una buona pratica. Basta usare 'search' invece di' match' e fa tutto per te. In effetti, è persino superiore, poiché non sarà possibile ottenere più corrispondenze con 'match' (invece restituirà l'ultimo, che è anche abbastanza intuitivo, rispetto al primo). –

Problemi correlati