2016-04-18 10 views
2

Ich möchte komplette Strings zu einem bestimmten Muster übereinstimmen. Lassen Sie uns sagen:Python Regex - Strings mit Newline ablehnen

word = "aaaa" 
test = re.match(r"^aaaa$", word) # this returns True 

Wenn jedoch das Wort von einem Newline-Zeichen folgt:

word = "aaaa\n" 
test = re.match(r"^aaaa$", word) # Also returns True :(

Aber ich möchte einen Weg finden, es in diesem letzten Fall Falsch zurückzukehren. Gibt es eine Möglichkeit, "\ n" zu unterscheiden?

+1

Es kann einen einfachen Weg geben, aber '^ aaaa (? = (?! \ N) $)' wird funktionieren – rock321987

Antwort

1

Sie können negative lookaheads verwenden, um zu überprüfen, ob es ein neues Zeilenzeichen enthält oder nicht.In Ihrem Fall ^aaaa(?!\n)$.

4

Statt Anker ^ und $ Verwendung \A für Start- und \Z für Ende:

>>> print re.match(r'\Aaaaa\Z', 'aaaa') 
<_sre.SRE_Match object at 0x1014b9bf8> 

>>> print re.match(r'\Aaaaa\Z', 'aaaa\n') 
None 

\A entspricht dem tatsächlichen Beginn der Zeichenfolge und \Z das tatsächliche Ende und es kann nur einen von \A und \Z in a sein mehrzeilige Zeichenfolge, wobei $ in jeder Zeile übereinstimmen kann.

Ich schlage vor, reading this very good article on permanent line anchors.

Gerade FYI im Gegensatz zu .NET, Java, PCRE, Delphi, PHP in Python\Z Matches erst ganz am Ende der Kette. Python unterstützt \z nicht.

+1

Erstaunlich. Ich weiß nicht, wie ich das vermisst habe! Vielen Dank. –

+0

Gut zu wissen, dass es funktioniert hat [Sie können die Antwort als akzeptiert markieren, indem Sie auf ** Häkchen ** oben links in dieser Antwort klicken] (http://meta.stackexchange.com/a/5235/160242) – anubhava