Python -Code, um einen regulären Ausdruck zu verwenden, um sicherzustellen, dass eine Zeichenfolge alphanumerische Plus ist. - _

StackOverflow https://stackoverflow.com/questions/2519670

  •  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 ...

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top