2013-05-12 12 views
7

Zum Beispiel:
Mein String ist: 123456789 nn nn oo nn nn mlm nn203.
Mein Ziel ist: nn.Wie verwenden Sie reguläre Ausdrücke umgekehrte Suche?

Dann bin ich Zeichenfolge vom Ende bis zum Anfang übereinstimmen und das erste Ergebnis und seine Position zurückgeben.
In diesem Beispiel ist das Ergebnis nn Start in [-5] Ende in [-3].
Ich schrieb die einfache funcitonto diesen Prozess, aber wie Sie mit regulären Ausdrücken, um diesen Job zu tun?

+0

Hm, wenn die Suche Begriff war 'na', möchten Sie es vorwärts oder rückwärts in der Zeichenfolge (dh Mann oder Name übereinstimmen)? –

Antwort

2

Erstens, wenn Sie nicht nach einem regulären Ausdruck suchen, string.rfind ist viel einfacher, richtig zu bekommen.

Sie können einen regulären Ausdruck verwenden, indem eine negative Vorschau Verwendung finden Sie in der Dokumentation von 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

Für die Zeichenfolge selbst, sondern nur eine findall tun und nutzen die letzte:

import re 

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

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

Prints nn5

Sie können auch das gleiche tun mit finditer, die es einfacher zu finden die Re levant Indizes:

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

Drucke ('nn5', 27, 30)

Wenn Sie viele Spiele haben, und Sie wollen nur die letzte, manchmal ist es sinnvoll, einfach die Zeichenfolge und Muster zu umkehren:

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

Drucke nn5

+0

Hier ist etwas ähnlich zu Ihrem Code, das viele für besser lesbar halten: http://pastebin.com/J7SsXjsS (Beachten Sie, dass 'search' existiert, nachdem die Schleife beendet ist.) – Shule

+0

In diesem Link, den ich gab, erhalten Sie ein Fehler, wenn Sie keine Ergebnisse erhalten (also sicher sein, damit umzugehen). – Shule

2

Idee:

  • finden regexp umgekehrt (in Ihrem Fall irrelevant) in umgekehrter Zeichenfolge
  • resultierenden Indizes umwandeln zu negativen Zahlen + Startschalter < -> Ende

Beispiel:

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