2016-05-30 10 views
2

Ich versuche, eine bestimmte Zeichenfolge mit RegEx zu finden. Ich möchte "etwas finden, das mit 'f' beginnt und mit der ersten 2 endet" (es muss nur eine 2 enthalten). In diesem Beispiel möchte ich result = "fdba12" finden, aber der Code unten gibt mir 'fdba12312' (enthält zwei 2). Wie kann ich aufhören zu suchen, wenn ich sofort 2 finde?Regulärer Ausdruck Findall Stoppen Suche in erster Instanz

import re 
string2 = "asfdba12312 sssdr1 12şljş1 kf" 

t = re.findall(r'[f][\w]*[2]', string2) 
print(t) 
+1

Oder 'f [^ \ W2] * 2'. –

+1

In Verbindung stehende [Python nicht-gierige Regexe] (http://stackoverflow.com/q/766372) –

Antwort

1

Das Problem ist, dass Ihr regex ein \w* Muster enthält, das auch die angrenzenden 2 Muster entsprechen kann. Es gibt 2 Möglichkeiten, um das zu erreichen, was Sie brauchen: 1) Verwenden eines von rock321987 vorgeschlagenen Lazy-Quantors und 2) Verwenden einer umgekehrten Stencil-Char-Klasse innerhalb einer negierten Zeichenklasse [^...] und auch negieren 2.

So verwenden

f[^\W2]*2 

Siehe regex demo

Das [^\W2]* Muster entspricht null oder mehr Zeichen andere als Nicht-Wort-Zeichen (so, es stimmt mit allen Wortzeichen) und andere als diejenigen 2.

Hinweis: gieriges Matching ist hier schneller als faules Matching.