web-dev-qa-db-fra.com

Détectez les chaînes avec des caractères non anglais dans Python

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.

26
TJ1

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&')
51
Salvador Dali

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
11
Katrina Malakhova
import re

english_check = re.compile(r'[a-z]')

if english_check.match(w):
    print "english",w
else:
    print "other:",w
3
PemaGrg
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.

0
Furkan