J'ai quelques chaînes qui ont un mélange d'anglais et pas de lettres anglaises. Par exemple:
w='_1991_اف_جي2'
Comment puis-je reconnaître ces types de chaînes en utilisant Regex ou toute autre méthode rapide en Python?
Je préfère ne pas comparer les lettres de la chaîne une par une avec une liste de lettres, mais le faire en une seule fois et rapidement.
Vous pouvez simplement vérifier si la chaîne ne peut être encodée qu'avec des caractères ASCII (qui sont l'alphabet latin + quelques autres caractères). Si elle ne peut pas être encodée, alors elle contient les caractères d'un autre alphabet. .
Notez le commentaire # -*- coding: ....
. Il devrait être là en haut du fichier python (sinon vous recevrez une erreur sur le codage)
# -*- coding: utf-8 -*-
def isEnglish(s):
try:
s.encode(encoding='utf-8').decode('ascii')
except UnicodeDecodeError:
return False
else:
return True
assert not isEnglish('slabiky, ale liší se podle významu')
assert isEnglish('English')
assert not isEnglish('ގެ ފުރަތަމަ ދެ އަކުރު ކަ')
assert not isEnglish('how about this one : 通 asfަ')
assert isEnglish('?fd4))45s&')
Si vous travaillez avec des chaînes (pas des objets Unicode), vous pouvez les nettoyer avec la traduction et vérifier avec isalnum()
, ce qui est mieux que de lever des exceptions:
import string
def isEnglish(s):
return s.translate(None, string.punctuation).isalnum()
print isEnglish('slabiky, ale liší se podle významu')
print isEnglish('English')
print isEnglish('ގެ ފުރަތަމަ ދެ އަކުރު ކަ')
print isEnglish('how about this one : 通 asfަ')
print isEnglish('?fd4))45s&')
print isEnglish('Текст на русском')
> False
> True
> False
> False
> True
> False
Vous pouvez également filtrer les caractères non ascii de la chaîne avec cette fonction:
ascii = set(string.printable)
def remove_non_ascii(s):
return filter(lambda x: x in ascii, s)
remove_non_ascii('slabiky, ale liší se podle významu')
> slabiky, ale li se podle vznamu
import re
english_check = re.compile(r'[a-z]')
if english_check.match(w):
print "english",w
else:
print "other:",w
w.isidentifier()
Vous pouvez facilement voir la méthode dans docs :
Renvoie vrai si la chaîne est un identifiant valide selon la définition du langage, section Identificateurs et mots-clés.