Как распарсить строку, написанную на русском при английской раскладке клавиатуры? Например, имеем строку "Dctv ghbdtn", что означает "Всем привет".
- 2,216
- 1
- 12
- 37
- 43
2 Answers
Чтобы раскладку неверную поправить:
layout = dict(zip(map(ord, "qwertyuiop[]asdfghjkl;'zxcvbnm,./`"
'QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?~'),
"йцукенгшщзхъфывапролджэячсмитьбю.ё"
'ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё'))
print("Dctv Ghbdtn".translate(layout))
# -> Всем Привет
- 52,361
-
1может стоит поменять заголовок вопроса, чтобы люди с поисковиков могли попасть на этот вопрос? – MaxU - stand with Ukraine Apr 10 '18 at 15:13
Сначала делаем словарь для перевода из латиницы в кириллицу:
lat2cyr = {'q':'й', 'w':'ц', 'e':'у', 'r':'к', 't':'е', 'y':'н', ... }
Есть недостаток: некоторые буквы могут зависит от конкретной клавиатуры, и вообще, не всем кириллическим буквам соответствуют буквы из латиницы (у нас же 33 буквы, а там 26). У меня на Маке так: \ - ё, ' - э, ; - ж, , - б, . - ю
Затем делаем функцию для перевода каждой буквы:
def translate(text):
# чтобы не париться ещё и с большими буквам
text = text.lower()
res = ''
for l in text:
# если буква есть в словаре
if l in lat2cyr:
# сохранить перевод
res += lat2cyr[l]
else:
# иначе сохранить оригинал
res += l
return res
Описанный способ можно улучшить, если заменять символы только в составе слов, а не одиночные. А если Вы ожидаете, что ляпы с раскладкой будут делать только в приветственных фразах, то можно сделать словарь для нескольких слов, и только их заменять:
lat2cyr = {'ghbdtn': 'привет', ...}
def translate(text):
text = text.lower()
for word in lat2cyr:
text = replace(word, lat2cyr[word])
return text
Надеюсь, у Вас нет проблемы определить, какой текст нужно так обрабатывать, а какой нет (чтобы ненароком не преобразовать так нормальный английский).
- 9,858
-
Твой ответ полезный том плане что буду пользователей разделять по User-Agent. – Sasha Apr 10 '18 at 15:04
dictзначение каждой буквы в соответствии с раскладкой(ключ - английская буква, значение - русская), проходись по строке и в новую строку складывай значения. Потом возвращаешь новую строку. – Klimenko Kirill Apr 10 '18 at 13:01