2016-07-02 11 views
3

Wie passe ich in python3 genau Whitespace-Zeichen und nicht Newline \ n oder Tab \ t?Nur Python-Regex-Übereinstimmungsraum

Ich habe die \s+[^\n] Antwort von Regex match space not \n Antwort gesehen, aber für das folgende Beispiel funktioniert es nicht:

a='rasd\nsa sd' 
print(re.search(r'\s+[^ \n]',a)) 

Ergebnis ist <_sre.SRE_Match object; span=(4, 6), match='\ns'>, die das Newline abgestimmt ist.

+0

BTW, die 'r '\ s + [^ \ n]'' Sie haben geliefert Antwort eine akzeptierte nicht einmal wurde und Python 're' unterstützt keine POSIX-Zeichenklassen wie' [[:: blank:]] '' –

Antwort

4

Keine Notwendigkeit für spezielle Gruppen. Erstellen Sie einfach eine Regex mit einem Leerzeichen. Das Leerzeichen hat keine besondere Bedeutung, es bedeutet nur "Übereinstimmung mit einem Leerzeichen".

RE = re.compile(' +') 

So für Ihren Fall

a='rasd\nsa sd' 
print(re.search(' +', a)) 

würde

<_sre.SRE_Match object; span=(7, 8), match=' '> 
+0

Ja, das ist der Fall, ich habe gerade erwartet, dass es eine unabhängige Escape-Sequenz hat, wie andere Whitespaces auch. – Dimitry

6

Wenn Sie abgleichen möchten 1 oder mehr Leerzeichen Zeichen außer dem Newline und eine Registerkarte Verwendung

r"[^\S\n\t]+" 

Die [^\S] passt auf jedes Zeichen, das kein nicht-Leerzeichen ist = jeder char, die Leerzeichen ist. Da die Zeichenklasse jedoch eine negierte Zeichenklasse ist, werden sie beim Hinzufügen von Zeichen von der Übereinstimmung ausgeschlossen.

Python demo:

import re 
a='rasd\nsa sd' 
print(re.findall(r'[^\S\n\t]+',a)) 
# => [' '] 

Einige weitere Überlegungen: \s matches [ \t\n\r\f\v] wenn ASCII-Flag verwendet wird. Wenn Sie also nur ASCII verwenden möchten, können Sie auch [ \r\f\v] verwenden, um die gewünschten Zeichen auszuschließen. Wenn Sie mit Unicode-Zeichenfolgen arbeiten müssen, ist die obige Lösung sinnvoll.