[Réparer] J'étais accro au jugement alphanumérique des chaînes Python

*** Addenda *** Il y a eu un problème avec l'article, veuillez donc lire la partie supplémentaire sous le texte.

J'étais accro à

Un jour J'écrivais une application Web sur Google App Engine (Python).

Il y a des moments où vous souhaitez déterminer les caractères qui peuvent être utilisés dans un mot de passe dans un service Web, n'est-ce pas?

Quand je l'ai recherché, j'ai entendu dire que je pouvais vérifier s'il s'agissait d'un caractère alphanumérique avec character string.isalnum (), alors je l'ai utilisé.

Mais c'est drôle.

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

password = u'Ah'
password.isalnum()  #-->Vrai hein?

Apparemment, les caractères pleine largeur sont jugés True par la méthode isalnum. Terrible...

Solution

Je n'ai pas d'autre choix que d'utiliser des expressions régulières. Au fait, j'ai préparé diverses choses.

import re


#Minuscule demi-largeur
lowerReg = re.compile(r'^[a-z]+$')
def islower(s):
    return lowerReg.match(s) is not None

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

#Caractères alphabétiques
alphaReg = re.compile(r'^[a-zA-Z]+$')
def isalpha(s):
    return alphaReg.match(s) is not None

#Numéro demi-largeur
digitReg = re.compile(r'^[0-9]+$')
def isdigit(s):
    return digitReg.match(s) is not None

#Caractères alphanumériques demi-largeur
alnumReg = re.compile(r'^[a-zA-Z0-9]+$')
def isalnum(s):
    return alnumReg.match(s) is not None

#Caractères alphanumériques demi-largeur ou trait de soulignement
alnum_Reg = re.compile(r'^[a-zA-Z0-9_]+$')
def isalnum_(s):
    return alnum_Reg.match(s) is not None

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

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



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

J'ai senti qu'il y avait peu d'informations, alors prenez-en note.

Site de référence

...

Cela ne semble rien avoir à voir avec cela, mais Python3 n'est actuellement pas disponible sur Google App Engine (jusqu'à Python 2.7). Par conséquent, il existe deux types de chaînes de caractères, Unicode et str (pour être exact, des chaînes de caractères d'octets), ce qui n'est pas pratique ...

Postscript

Je vous ai fait remarquer dans le commentaire.

Il semble que la méthode isalnum ne fonctionne pas pour les chaînes Unicode. L'encodage en UTF8 fonctionne comme prévu.

En plus de la méthode isalnum, vous pouvez utiliser isalpha (alphabet), isdigit (nombre), islower (inférieur) et isupper (supérieur).

Il n'y a pas de méthode pour les autres jugements (comme le jugement ASCII), utilisez donc l'expression régulière dans le texte.

Pour Python 2.x

La méthode isalnum fonctionne correctement pour les chaînes de caractères.

Toutefois, si vous gérez des caractères pleine largeur tels que le japonais dans la chaîne de caractères str, il est plus pratique d'utiliser la chaîne de caractères unicode car vous ne pouvez pas obtenir le nombre de caractères souhaité. Dans ce cas, convertissez-le en str et vérifiez.

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

Pour Python 3.x

Dans la série Python 3.x, str et unicode sont intégrés, et bien qu'il soit nommé str, il s'agit en fait d'unicode. Par conséquent, même les chaînes littérales ordinaires doivent être codées en utf-8.

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

*** Ajouté ci-dessus ***

Recommended Posts

[Réparer] J'étais accro au jugement alphanumérique des chaînes Python
Ce à quoi j'étais accro lors de l'utilisation de Python tornado
Ce à quoi j'étais accro lorsque l'utilisateur de traitement est passé à Python
J'étais accro au multitraitement + psycopg2
Ce à quoi j'étais accro en présentant ALE à Vim pour Python
Ce à quoi j'étais accro avec json.dumps dans l'encodage base64 de Python
J'étais accro aux variables de classe et aux variables d'instance erronées en Python
J'étais accro à pip installer mysqlclient
J'étais accro à Flask sur dotCloud
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
J'étais accro à la création d'un environnement Python venv avec VS Code
Utilisez Python de Java avec Jython. J'étais aussi accro.
Le nom du fichier était mauvais en Python et j'étais accro à l'importation
[Introduction à json] Non, j'en étais accro. .. .. ♬
Python: j'ai pu récurer en lambda
AtCoder AGC 041 C - J'étais accro à la recherche complète de Domino Quality
Une note à laquelle j'étais accro lors de l'exécution de Python avec Visual Studio Code
Une histoire à laquelle j'étais accro après la communication SFTP avec python
J'ai essayé de résumer comment utiliser matplotlib de python
Une histoire à laquelle j'étais accro chez np.where
Python: peut être répété en lambda
[Python] J'ai essayé d'obtenir Json de squid ring 2
J'étais accro à essayer logging.getLogger avec Flask 1.1.x
Je veux manipuler des chaînes dans Kotlin comme Python!
J'ai essayé de résumer les opérations de chaîne de Python
J'étais sobrement accro à appeler awscli à partir d'un script Python 2.7 enregistré dans crontab
J'ai essayé de trouver l'entropie de l'image avec python
[IOS] Animation GIF avec Pythonista3. J'en étais accro.
Je souhaite spécifier une autre version de Python avec pyvenv
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Je veux démarrer beaucoup de processus à partir de python
Je veux connaître la nature de Python et pip
J'ai essayé d'implémenter le blackjack du jeu Trump en Python
[Python3] Liste des sites auxquels j'ai fait référence lorsque j'ai lancé Python
J'étais un peu accro à l'installation de Python3.3 + mod_wsgi3.4 sur Sakura VPS (CentOS), donc une note de révision
Quand j'ai essayé de gratter en utilisant des requêtes en python, j'étais accro à SSLError, donc un mémo de contournement
Une histoire à laquelle j'étais accro à appeler Lambda depuis AWS Lambda.
Le record auquel j'étais accro en mettant MeCab dans Heroku
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
Une note à laquelle j'étais accro lors de l'émission d'un bip sous Linux
Comment utiliser Python Kivy (référence) -J'ai traduit le langage Kivy de la référence API-
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
Notez que j'étais accro à l'interpolation des valeurs manquantes de sklearn (Imputer)
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
Je souhaite utiliser à la fois la clé et la valeur de l'itérateur Python
Une note à laquelle j'étais accro lors de la création d'une table avec SQL Alchemy
Python> Compréhension> Cellules> On m'a appris à utiliser la notation à double inclusion / itertools
[Introduction à l'application Udemy Python3 +] 12. Indexation et découpage des chaînes de caractères
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de collecter automatiquement des images de Kanna Hashimoto avec Python! !!
[Introduction à Python3 Jour 13] Chapitre 7 Chaînes de caractères (7.1-7.1.1.1)
[Introduction à Python3 Jour 14] Chapitre 7 Chaînes de caractères (7.1.1.1 à 7.1.1.4)
[Introduction à Python3 Jour 15] Chapitre 7 Chaînes de caractères (7.1.2-7.1.2.2)
Je veux déboguer avec Python