2017-12-27 7 views
1

Ich habe eine Zeichenfolge alsPython negativ Suche

string = ''' 
     making the regex for project 
     is the basic work ''' 

Die Regex-Bibliothek übereinstimmen muss, wenn es ‚Projekt‘ enthält und nicht die ‚Arbeit‘.

ich es wie folgt geschrieben:

bool(re.search('project.*(?!work)')) 

Es kehrt das wahr, wie es gefunden wurde. Aber es muss das Falsche zurückgeben.

+0

Warum nicht ['if 'Projekt' in s und 'Arbeit' nicht in s '] (https://ideone.com/n3Er0w)? BTW, die Regex ist einfach zu reparieren mit '' (? S) Projekt (?!. * Arbeit) '' –

+0

Aber ich brauche den regulären Ausdruck nur, weil mein Code viele reguläre Ausdrücke hat und es gibt eine Funktion, die die angegebene suchen wird Argument (re) und Rückgabe wahr/falsch in Abhängigkeit von der Anwesenheit. –

+1

Diese Frage muss überarbeitet werden. Der Beispielaufruf zu sea [r] ch ist entweder falsch, weil es ein kompiliertes re ist und doch eine Zeichenfolge übergeben wird, die wie ein RE aussieht, wenn es "stechen" sollte oder es ein Aufruf auf Modulebene ist und daher den Zu suchende Zeichenfolge, die als zweiter Parameter übergeben werden soll. – Nick

Antwort

4

eine negative looksahead nach einem quantifizierten Muster mit einem faulen oder gierigen Quantor Platzierung fast ergibt nie erwarteten Ergebnisse wegen Rückzieher: einmal die .* Streichhölzer 0+ Zeichen außer Zeilenumbruch verkohlt es überprüft das Look-Ahead-Muster und da es keine work gleich nach dem Ende der ersten Zeile ist das Ergebnis wahr.

die Regex zu beheben, Sie sicher . Streichhölzer Zeilenumbruch Zeichen machen müssen (re.DOTALL Modifikator passieren oder (?s) am Anfang hinzufügen) und .* zum Look-Ahead bewegen:

re.search(r'project(?!.*work)', s, re.DOTALL) 

die regex demo See.

Dieses Muster bedeutet: Find project und dann die Übereinstimmung fehlschlagen, wenn check Teilzeichenfolge nach 0+ Zeichen vorhanden ist.

Beachten Sie, dass es sinnvoller ist, if 'project' in s and 'work' not in s zu verwenden, um nach dem gleichen zu suchen, wenn Sie diese Regex verwenden möchten.

+0

Es hat funktioniert. Vielen Dank !!! –

+0

Diese Antwort entspricht nicht wirklich der ursprünglichen Anforderung '... zu entsprechen, wenn sie' Projekt 'und nicht' Arbeit 'enthält. Zum Beispiel gibt es true zurück, wenn s = 'Arbeit ist kein Projekt'. – Nick

+0

@Nick Der ursprüngliche Regex sollte nur dann eine Übereinstimmung verursachen, wenn nach dem Projekt "arbeiten" ist. Sonst hat es keinen Sinn, eine Regex zu verwenden, die Nicht-Regex-Lösung wird auch in meiner Antwort mitgeliefert und das wird jeden String prüfen, der "project" hat und nicht "work" hat. –