Python -Code, um einen regulären Ausdruck zu verwenden, um sicherzustellen, dass eine Zeichenfolge alphanumerische Plus ist. - _
-
22-09-2019 - |
Frage
Ich sah aus und suchte und konnte nicht finden, was ich brauchte, obwohl ich denke, dass es einfach sein sollte (wenn Sie eine Python -Erfahrung haben, was ich nicht habe).
Bei einer Zeichenfolge möchte ich in Python überprüfen, dass sie nur alphanumerische Zeichen enthält: a-zA-Z0-9
und .
_
-
Beispiele:
Akzeptiert:
bill-gates
Steve_Jobs
Micro.soft
Abgelehnt:
Bill gates
-- Keine Leerzeichen erlaubt
me@host.com
- @ ist nicht alphanumerisch
Ich versuche zu verwenden:
if re.match("^[a-zA-Z0-9_.-]+$", username) == True:
Aber das scheint den Job nicht zu machen ...
Lösung
re.match
Gibt keinen Booleschen zurück; es gibt a zurück MatchObject
in einem Match oder None
auf einem Nicht-Match.
>>> 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
Sie sollten also nicht tun re.match(...) == True
; Vielmehr sollten Sie überprüfen re.match(...) is not None
in diesem Fall, was weiter auf gerade gekürzt werden kann if re.match(...)
.
Andere Tipps
Benutze niemals == True
oder == False
im Vergleich. Viele Typen haben bereits ein Bool -Äquivalent, das Sie stattdessen verwenden sollten:
if re.match("^[a-zA-Z0-9_.-]+$", username):
Könnte es auch leicht verkürzen an:
if re.match(r'^[\w.-]+$', username):
Ich würde dies für einen gültigen Benutzernamen betrachten:
1) Benutzername muss 6-30 Zeichen lang sein
2) Der Benutzername kann nur enthalten:
- Groß-und Kleinbuchstaben
- Zahlen von 0-9 und
- Spezielle Charaktere _ - .
3) Benutzername darf nicht:
Beginnen Sie oder beenden Sie mit Zeichen _ -.
Haben mehr als ein sequentielles Zeichen _ -. Innerhalb
Dies wäre ein Beispiel für die Nutzung:
if re.match(r'^(?![-._])(?!.*[_.-]{2})[\w.-]{6,30}(?<![-._])$',username) is not None:
Ich mache meine Bestätigung in meiner Utils -Klasse auf diese Weise:
def valid_re(self, s, r):
reg = re.compile(r)
return reg.match(s)
Dann rufe ich die Utils -Instanz an und überprüfe so:
if not utils.valid_re(username, r'^[a-zA-Z0-9_.-]+$'):
error = "Invalid username!"
Wenn Sie viele reguläre Ausdrücke verwenden, können Sie es für Geschwindigkeit (oder Lesbarkeit) kompilieren.
import re
ALPHANUM=re.compile('^[a-zA-Z0-9_.-]+$')
for u in users:
if ALPHANUM.match(u) is None:
print "invalid"
Aus Die Dokumente:
Die kompilierten Versionen der neuesten Muster, an die übergeben wurde re.match()
, re.search()
oder re.compile()
werden zwischengespeichert, also müssen Programme, die jeweils nur wenige regelmäßige Ausdrücke verwenden, keine Sorge um die Zusammenstellung regelmäßiger Ausdrücke.