Как проверить слово на отсутствие смешивания кириллицы и латинского алфавита?
Проверка слова на отсутствие смешивания кириллицы и латинского алфавита. Вопрос заключается в том, как можно производить проверку текста (текст из БД), чтобы в одном слове не было букв латинского и русского алфавита?
Например "o [ou], p [pi:], c [si:], a [ei]" не заменяли аналогичные буквы русского алфавита и слово "горох" не было введено "гo([ou])pox", также в обратную сторону английское слово не должно содержать русских букв.
P.S. изначально не известно перед проверкой на каком языке написано слово, т.е. необходимо проверить, если ли в слове сочетания букв из двух разных алфавитов.
Ответы (3 шт):
Создать словари с похожими по написанию буквами
RU = ['а', 'с', 'е', 'р', 'х', 'о', ]
EN = ['a', 'c', 'e', 'p', 'x', 'o', ]
>>> ru == en
False
и проверять через функции, например:
def ru_only(word):
for e in EN:
if e in word:
return False
return True
def en_only(word):
for r in RU:
if r in word:
return False
return True
результат - True или False:
word = 'горox' # половина слова - кириллицей
>>> en_only(word)
False
>>> ru_only(word)
False
word = 'gopox' # всё латинскими
>>> en_only(word)
True
>>> ru_only(word)
False
word = 'горох' # всё кириллицей
>>> en_only(word)
False
>>> ru_only(word)
True
Проверка на то, все ли буквы из латинского алфавита:
import string
def all_en(word):
if all(c in string.ascii_letters for c in word):
return True
return False
Такая же проверка на русские буквы может быть разной, в зависимости от того, могут ли в словах быть цифры и прочие знаки (подчеркивание, например).
Можно, например, просто проверять, находится ли код символа в нужном диапазоне. Для UTF-8 можно использовать такой вариант:
def all_ru(word):
for letter in word:
if ord(letter) < 1040 or ord(letter) > 1103:
return False
return True
1040 - 1103 (0x410 - 0x44f) это диапазон кодов для русского алфавита (без "Ёё"). Для ё/Ё нужно еще добавить проверку на равенство 1025 или 1105 (0x401 / 0x451):
def all_ru(word): # немного оптимизировал еще тут
for letter in word:
code = ord(letter)
if not(1040 < code < 1103) and code != 1025 and code != 1105:
return False
return True
Ну и то, что вам нужно, в итоге таким образом:
def contains_en_and_ru(word):
if not all_ru(word) and not all_en(word):
return True # есть латинские и кириллица
return False # только латинские или только кириллица
Можно попробoвать так
def has_mix(word):
if len(word) == 0:
return False
page = ord(word[0]) & 0x1fff00
return not all(map(lambda x: ord(x) & 0x1fff00 == page, word))
ss = ["hello", "helloумир", "привет"]
for s in ss:
print(s, ":", has_mix(s))
Вывод:
hello : False
helloумир : True
привет : False
можно упростить и проверять один бит
def has_mix(word):
if len(word) == 0:
return False
page = ord(word[0]) & 0x400
return not all(map(lambda x: ord(x) & 0x400 == page, word))