Обнаружение строк с неанглийскими символами в 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'
Чтобы добавить буквы латинского акцентирования, вы можете обратиться к этому сообщению.