2012-12-19 17 views
8

Das Muster (?<!(asp|php|jsp))\?.* funktioniert in PCRE, aber es funktioniert nicht in Python.Python Regex Negative Lookbehind

Was kann ich tun, damit diese Regex in Python funktioniert? (Python 2.7)

+6

Wie funktioniert es nicht? Gibt es einen Fehler? Wenn ja, poste den Fehler. Passt es nicht zu dem, was Sie erwarten? Wenn ja, poste den Code, wo du ihn verwendest, und zeige die Ausgabe, die du bekommst, im Gegensatz zu dem, was du erwartest. – BrenBarn

+0

Hier ist die [doc] (http://docs.python.org/2/library/re.html) für das re-Modul, klar die Unterstützung von negativen Lookbehind Assertions. –

+3

Negative Lookbehinds funktionieren solange, bis alle Alternativen gleich lang sind. Also funktioniert das '(? georg

Antwort

9

Es funktioniert vollkommen in Ordnung für mich. Benutzt du es vielleicht falsch? Stellen Sie sicher, re.search statt re.match zu verwenden:

>>> import re 
>>> s = 'somestring.asp?1=123' 
>>> re.search(r"(?<!(asp|php|jsp))\?.*", s) 
>>> s = 'somestring.xml?1=123' 
>>> re.search(r"(?<!(asp|php|jsp))\?.*", s) 
<_sre.SRE_Match object at 0x0000000002DCB098> 

Welches ist genau, wie Ihr Muster verhalten soll. Wie glglgl erwähnt, können Sie die Übereinstimmung erhalten, wenn Sie das Objekt Match einer Variablen zuweisen (zB m) und dann m.group() aufrufen. Das ergibt ?1=123.

Übrigens können Sie die inneren Klammern weglassen. Dieses Muster ist gleichwertig:

(?<!asp|php|jsp)\?.* 
+1

... und 're.search (r" (? glglgl