Обнаружение строк с неанглийскими символами в Python

У меня есть несколько строк, в которых есть сочетание английского и никаких английских букв. Например:

w='_1991_اف_جي2'

Как я могу распознать эти типы строк с помощью Regex или любого другого быстрого метода в Python?

Я предпочитаю не сравнивать буквы строки один за другим со списком букв, но делать это одним выстрелом и быстро.

Ответ 1

Вы можете просто проверить, может ли строка быть закодирована только с помощью символов ASCII (латинский алфавит + некоторые другие символы). Если он не может быть закодирован, то в нем есть символы из другого алфавита.

Обратите внимание на комментарий # -*- coding:.... Он должен быть в верхней части файла python (в противном случае вы получите сообщение об ошибке)

# -*- 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&')

Ответ 2

Если вы работаете со строками (не unicode-объектами), вы можете очистить их с помощью перевода и проверить с помощью isalnum(), что лучше, чем бросать исключения:

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

Также вы можете отфильтровать не-ascii символы из строки с помощью этой функции:

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

Ответ 3

import re

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

if english_check.match(w):
    print "english",w
else:
    print "other:",w

Ответ 4

w.isidentifier()

Вы можете легко увидеть метод в документах:

Верните true, если строка является допустимым идентификатором в соответствии с определением языка, разделом Идентификаторы и ключевыми словами.

Ответ 5

Я считаю, что у этого будет минимальное время выполнения, так как он останавливается, когда находит символ, который не является латинской буквой. Он также использует генератор для лучшего использования памяти.

import string

def has_only_latin_letters(name):
    char_set = string.ascii_letters
    return all((True if x in char_set else False for x in name))

>>> has_only_latin_letters('_1991_اف_جي2')
False
>>> has_only_latin_letters('bla bla')
True
>>> has_only_latin_letters('blä blä')
False
>>> has_only_latin_letters('저주중앙초등학교')
False
>>> has_only_latin_letters('also a string with numbers and punctuation 1, 2, 4')
True

Вы также можете использовать другой набор символов:

>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

>>> string.ascii_lowercase
'abcdefghijklmnopqrstuvwxyz'

>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>[email protected][\\]^_'{|}~'

>>> string.digits
'0123456789'

>>> string.digits + string.lowercase
'0123456789abcdefghijklmnopqrstuvwxyz'    

>>> string.printable
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%& 
\'()*+,-./:;<=>[email protected][\\]^_'{|}~ \t\n\r\x0b\x0c'

Чтобы добавить буквы латинского акцентирования, вы можете обратиться к этому сообщению.