2013-05-12 15 views
7

Ad esempio:
La mia stringa è: 123456789 nn nn oo nn nn mlm nn203.
Il mio obiettivo è: nn.Come utilizzare le espressioni regolari per invertire la ricerca?

Quindi, abbino la stringa dall'inizio alla fine e restituisco il risultato della prima corrispondenza e la sua posizione.
In questo esempio, il risultato è nn inizio in [-5] fine in [-3].
Ho scritto il semplice funcitonto di fare questo processo, ma come usare le espressioni regolari per fare questo lavoro?

+0

Hm, se la ricerca termine era 'na', ti piacerebbe che corrispondesse in avanti o indietro nella stringa (ad esempio corrispondenza uomo o nome)? –

risposta

2

In primo luogo, se non si sta cercando un'espressione regolare, lo string.rfind è molto più semplice da ottenere.

È possibile utilizzare un'espressione regolare usando un lookahead negativo, consultare la documentazione di re:

import re 
s = "123456789 nn nn oo nn nn mlm nn203" 
match = re.search("(nn)(?!.*nn.*)", s) 

# for your negative numbers: 
print (match.start()-len(s), match.end()-len(s)) 
# (-5, -3) 
10

Per la stringa stessa, basta fare una findall e utilizzare l'ultimo:

import re 

st='123456 nn1 nn2 nn3 nn4 mlm nn5 mlm' 

print re.findall(r'(nn\d+)',st)[-1] 

Stampe nn5

Puoi anche fare la stessa cosa usando finditer che rende più facile trovare il re indici Levant:

print [(m.group(),m.start(),m.end()) for m in re.finditer(r'(nn\d+)',st)][-1] 

Prints ('nn5', 27, 30)

Se si dispone di un sacco di partite e si desidera solo l'ultimo, a volte ha senso per invertire semplicemente la corda e modello:

m=re.search(r'(\d+nn)',st[::-1]) 
offset=m.start(1) 
print st[-m.start(1)-len(m.group(1)):-m.start(1)] 

Stampe nn5

+0

Ecco qualcosa di simile al tuo codice che molti potrebbero considerare più leggibile: http://pastebin.com/J7SsXjsS (nota che 'search' esiste dopo che il ciclo è terminato.) – Shule

+0

In quel link che ho dato, riceverai un errore se non si ottiene alcun risultato, comunque (quindi assicuratevi di gestirlo). – Shule

2

Idea:

  • trovare invertito regexp (nel tuo caso irrilevante) nella stringa invertita
  • indici derivanti convertire in numeri negativi + interruttore di avviamento < -> fine

Esempio:

>>> import re 
>>> s = "123456789 nn nn oo nn nn mlm nn203" 
>>> m = re.search("(nn)", s[::-1]) 
>>> -m.end(), -m.start() 
(-5, -3) 
Problemi correlati