2010-03-25 9 views
5

Ich schaute und suchte und konnte nicht finden, was ich brauchte, obwohl ich denke, dass es einfach sein sollte (wenn Sie irgendein Python-Erlebnis haben, was ich nicht mache).Python-Code zur Verwendung eines regulären Ausdrucks, um sicherzustellen, dass eine Zeichenfolge alphanumerisch plus ist. - _

ein String gegeben, ich will, in Python überprüfen, dass es nur alphanumerische Zeichen enthält: a-zA-Z0-9 und ._-

Beispiele:

Akzeptiert:

bill-gates

Steve_Jobs

Micro.soft

zurückgewiesen:

Bill gates - keine Leerzeichen

erlaubt

[email protected] - @ ist nicht alphanumerische

Ich versuche zu verwenden:

if re.match("^[a-zA-Z0-9_.-]+$", username) == True:

Aber das scheint die Aufgabe nicht zu erfüllen ...

+3

re.match() gibt keinen boolean, gibt es ein [Matchobject] (http://docs.python.org/ library/re.html # re.match), die "immer einen booleschen Wert True" oder None hat. –

+0

Es ist immer schlecht, '== True' zu ​​verwenden. Es ist bestenfalls redundant und in einem solchen Fall funktioniert es einfach nicht. –

+2

Halten Sie (zB) '---.___' zum Beispiel für eine gültige Übereinstimmung? –

Antwort

15

re.match gibt keinen booleschen Wert zurück; Es gibt eine MatchObject auf einem Spiel oder None auf einem nicht übereinstimmen.

>>> re.match("^[a-zA-Z0-9_.-]+$", "hello") 
<_sre.SRE_Match object at 0xb7600250> 
>>> re.match("^[a-zA-Z0-9_.-]+$", " ") 
>>> print re.match("^[a-zA-Z0-9_.-]+$", " ") 
None 

Also sollten Sie nicht tun re.match(...) == True; Stattdessen sollten Sie in diesem Fall re.match(...) is not None überprüfen, was weiter auf if re.match(...) verkürzt werden kann.

3

Niemals == True oder == False in einem Vergleich verwenden. Viele Arten haben bereits einen Bool Äquivalent, die Sie stattdessen verwenden sollten:

if re.match("^[a-zA-Z0-9_.-]+$", username): 
2

Könnte es auch verkürzen leicht zu:

if re.match(r'^[\w.-]+$', username): 
0

Wenn Sie vorhaben, viele reguläre Ausdrücke verwenden, können Sie es für Geschwindigkeit kompilieren (oder Lesbarkeit)

import re 
ALPHANUM=re.compile('^[a-zA-Z0-9_.-]+$') 

for u in users: 
    if ALPHANUM.match(u) is None: 
     print "invalid" 

Von the docs:

Die kompilierten Versionen der letzten Muster, die an re.match(), re.search() oder re.compile() übergeben wurden, werden zwischengespeichert. Daher müssen sich Programme, die nur einige reguläre Ausdrücke gleichzeitig verwenden, keine Gedanken über das Kompilieren regulärer Ausdrücke machen.

0

ich meine Validierung auf diese Weise in meiner utils Klasse:

def valid_re(self, s, r): 
reg = re.compile(r) 
return reg.match(s) 

Dann rufe ich die utils-Instanz, und prüfen Sie auf diese Weise:

if not utils.valid_re(username, r'^[a-zA-Z0-9_.-]+$'): 
     error = "Invalid username!" 
0

ich dies für gültige Benutzername in Betracht ziehen würde:
1) Benutzername muss 6-30 Zeichen lang sein
2) Benutzername darf nur enthalten:

  • Groß- und Kleinbuchstaben
  • Zahlen von 0-9 und
  • Sonderzeichen _ -.

3) Benutzername darf nicht:

  • mit Zeichen beginnen oder beenden _ -.

  • Haben Sie mehr als ein Folgezeichen _ -. innen

Dieses Beispiel für die Nutzung wäre:
if re.match(r'^(?![-._])(?!.*[_.-]{2})[\w.-]{6,30}(?<![-._])$',username) is not None:

Verwandte Themen