[Fix] Ich war süchtig nach dem alphanumerischen Urteil über Python-Strings

*** Nachtrag *** Mit dem Artikel stimmte etwas nicht. Lesen Sie daher bitte den zusätzlichen Teil unter dem Text.

Ich war süchtig nach

Eines Tages Ich habe eine Web-App in Google App Engine (Python) geschrieben.

Es gibt Zeiten, in denen Sie die Zeichen bestimmen möchten, die in einem Kennwort in einem Webdienst verwendet werden können, oder?

Als ich es nachgeschlagen habe, habe ich gehört, dass ich überprüfen kann, ob es sich um ein alphanumerisches Zeichen mit "Zeichenfolge.isalnum ()" handelt, also habe ich das verwendet.

Aber es ist lustig.

password = 'abc123'
password.isalnum()  #--> True

password = u'Ah'
password.isalnum()  #-->Stimmt wie?

Anscheinend werden Zeichen voller Breite nach der isalnum-Methode als wahr beurteilt. Furchtbar...

Lösung

Ich habe keine andere Wahl, als reguläre Ausdrücke zu verwenden. Ich habe übrigens verschiedene Dinge vorbereitet.

import re


#Kleinbuchstaben in halber Breite
lowerReg = re.compile(r'^[a-z]+$')
def islower(s):
    return lowerReg.match(s) is not None

#Halbbreites Kapital
upperReg = re.compile(r'^[A-Z]+$')
def isupper(s):
    return upperReg.match(s) is not None

#Alphabetische Zeichen
alphaReg = re.compile(r'^[a-zA-Z]+$')
def isalpha(s):
    return alphaReg.match(s) is not None

#Nummer halber Breite
digitReg = re.compile(r'^[0-9]+$')
def isdigit(s):
    return digitReg.match(s) is not None

#Alphanumerische Zeichen halber Breite
alnumReg = re.compile(r'^[a-zA-Z0-9]+$')
def isalnum(s):
    return alnumReg.match(s) is not None

#Alphanumerische Zeichen halber Breite oder Unterstrich
alnum_Reg = re.compile(r'^[a-zA-Z0-9_]+$')
def isalnum_(s):
    return alnum_Reg.match(s) is not None

#Symbol halber Breite
symbolReg = re.compile(r'^[!-/:-@[-`{-~]+$')
def issymbol(s):
    return symbolReg.match(s) is not None

#ASCII-Zeichen
asciiReg = re.compile(r'^[!-~]+$')
def isascii(s):
    return asciiReg.match(s) is not None



isalnum('abc123')  #--> True
isalnum(u'Ah')  #--> False

Ich hatte das Gefühl, dass es wenig Informationen gab, also notieren Sie es sich.

Referenzseite

...

Es scheint nichts damit zu tun zu haben, aber Python3 ist derzeit nicht in Google App Engine verfügbar (bis Python 2.7). Daher gibt es zwei Arten von Zeichenfolgen, Unicode und str (um genau zu sein, Byte-Zeichenfolgen), was unpraktisch ist ...

Nachtrag

Ich habe Sie im Kommentar darauf hinweisen lassen.

Es scheint, dass die isalnum-Methode für Unicode-Zeichenfolgen nicht funktioniert. Die Codierung in UTF8 funktioniert wie erwartet.

Zusätzlich zur Isalnum-Methode können Sie Isalpha (Alphabet), Isdigit (Zahl), Islower (unten) und Isupper (oben) verwenden.

Es gibt keine Methode für andere Urteile (z. B. ASCII-Urteile). Verwenden Sie daher den regulären Ausdruck im Text.

Für Python 2.x.

Die isalnum-Methode funktioniert korrekt für str-Strings.

Wenn Sie jedoch Zeichen in voller Breite wie Japanisch in der Zeichenfolge str verarbeiten, ist es bequemer, die Unicode-Zeichenfolge zu verwenden, da Sie nicht die gewünschte Anzahl von Zeichen abrufen können. In diesem Fall konvertieren Sie es in str und überprüfen.

u'Ah'.encode('utf-8').isalnum()  #--> False

Für Python 3.x.

In der Python 3.x-Serie sind str und unicode integriert, und obwohl es str heißt, handelt es sich tatsächlich um Unicode. Daher müssen auch gewöhnliche String-Literale in utf-8 codiert werden.

'Ah'.encode('utf-8').isalnum()  #--> False

*** Oben hinzugefügt ***

Recommended Posts

[Fix] Ich war süchtig nach dem alphanumerischen Urteil über Python-Strings
Wovon ich süchtig war, als ich Python Tornado benutzte
Wovon ich süchtig war, als der Processing-Benutzer zu Python wechselte
Ich war süchtig nach Multiprocessing + Psycopg2
Wovon ich süchtig war, als ich ALE in Vim für Python einführte
Was ich mit json.dumps in Pythons base64-Codierung süchtig gemacht habe
Ich war süchtig nach falschen Klassenvariablen und Instanzvariablen in Python
Ich war süchtig danach, mysqlclient zu installieren
Ich war auf dotCloud süchtig nach Flask
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Ich war süchtig danach, eine Python-Venv-Umgebung mit VS Code zu erstellen
Verwenden Sie Python aus Java mit Jython. Ich war auch süchtig danach.
Der Dateiname war in Python schlecht und ich war süchtig nach Import
[Einführung in json] Nein, ich war süchtig danach. .. .. ♬
Python: Ich konnte in Lambda rekursieren
AtCoder AGC 041 C - Ich war süchtig nach der vollständigen Suche nach Domino-Qualität
Ein Hinweis, dem ich beim Ausführen von Python mit Visual Studio Code verfallen war
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Eine Geschichte, von der ich bei np.where süchtig war
Python: Kann in Lambda wiederholt werden
[Python] Ich habe versucht, Json von Tintenfischring 2 zu bekommen
Ich war süchtig danach, logging.getLogger mit Flask 1.1.x zu versuchen
Ich möchte Strings in Kotlin wie Python manipulieren!
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich war nüchtern süchtig danach, awscli von einem in crontab registrierten Python 2.7-Skript aus aufzurufen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[IOS] GIF-Animation mit Pythonista3. Ich war süchtig danach.
Ich möchte eine andere Version von Python mit pyvenv angeben
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
Ich möchte viele Prozesse von Python aus starten
Ich möchte die Natur von Python und Pip kennenlernen
Ich habe versucht, das Blackjack of Trump-Spiel mit Python zu implementieren
[Python3] Liste der Websites, auf die ich beim Starten von Python verwiesen habe
Ich war ein wenig süchtig nach der Installation von Python3.3 + mod_wsgi3.4 auf Sakura VPS (CentOS), also ein Hinweis zur Überprüfung
Als ich versuchte, mithilfe von Anforderungen in Python zu kratzen, war ich süchtig nach SSLError, also einem Workaround-Memo
Eine Geschichte, die ich süchtig danach war, Lambda von AWS Lambda anzurufen.
Die Platte, von der ich süchtig war, als ich MeCab in Heroku einsetzte
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Ein Hinweis, von dem ich süchtig war, als ich unter Linux einen Piepton machte
Verwendung von Python Kivy (Referenz) -Ich habe die Kivy-Sprache der API-Referenz übersetzt-
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Beachten Sie, dass ich süchtig nach der fehlenden Wertinterpolation von sklearn war (Imputer)
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Ich möchte sowohl den Schlüssel als auch den Wert des Python-Iterators verwenden
Ein Hinweis, dem ich beim Erstellen einer Tabelle mit SQL Alchemy verfallen war
Python> Verständnis> Zellen> Mir wurde beigebracht, wie man Double Inclusion Notation / itertools verwendet
[Einführung in die Udemy Python3 + -Anwendung] 12. Indizieren und Schneiden von Zeichenketten
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, automatisch Bilder von Kanna Hashimoto mit Python zu sammeln! !!
[Einführung in Python3 Tag 13] Kapitel 7 Zeichenfolgen (7.1-7.1.1.1)
[Einführung in Python3 Tag 14] Kapitel 7 Zeichenfolgen (7.1.1.1 bis 7.1.1.4)
[Einführung in Python3 Tag 15] Kapitel 7 Zeichenfolgen (7.1.2-7.1.2.2)
Ich möchte mit Python debuggen