Небольшая проблема с пробелами / пунктуацией в питоне?

У меня есть эта функция, которая будет конвертировать текстовый язык на английский:

def translate(string):
    textDict={'y':'why', 'r':'are', "l8":'late', 'u':'you', 'gtg':'got to go',
        'lol': 'laugh out    loud', 'ur': 'your',}
    translatestring = ''
    for word in string.split(' '):
        if word in textDict:
            translatestring = translatestring + textDict[word]
        else:
            translatestring = translatestring + word
    return translatestring

Однако, если я хочу перевести y u l8? это вернется whyyoul8?, Как бы я мог разделить слова, когда я их возвращаю, и как мне справиться с пунктуацией? Любая помощь приветствуется!

5 ответов

Понимание oneliner:

''.join(textDict.get(word, word) for word in re.findall('\w+|\W+', string))

[Редактировать] Исправлено регулярное выражение.

"y u l8" разделить на " ", дает ["y", "u", "l8"]. После подстановки вы получаете ["почему", "вы", "поздно"] - и вы объединяете их без добавления пробелов, поэтому вы получаете "Whyyoulate". Обе вилки if должны вставлять пробел.

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

Я хотел бы предложить следующую замену для этого цикла:

for word in string.split(' '):
    if word in textDict:
        translatestring = translatestring + textDict[word]
    else:
        translatestring = translatestring + word

для слова в string.split(' '): translatetring += textDict.get(word, word)

dict.get(foo, default) будет смотреть вверх foo в словаре и использовать default если foo еще не определено

(Время запуска, короткие заметки сейчас: при разделении вы можете разделить на основе знаков препинания, а также пробелов, сохранить знаки препинания или пробелы и повторно ввести их при присоединении к выходной строке. Это немного больше работы, но это будет справиться с работой.)

Вы можете просто добавить + ' ' + добавить пробел. Тем не менее, я думаю, что вы пытаетесь сделать это:

import re

def translate_string(str):
    textDict={'y':'why', 'r':'are', "l8":'late', 'u':'you', 'gtg':'got to go',  'lol': 'laugh out loud', 'ur': 'your',}
    translatestring = ''
    for word in re.split('([^\w])*', str):
        if word in textDict:
            translatestring += textDict[word]
        else:
            translatestring += word

    return translatestring


print translate_string('y u l8?')

Это напечатает:

why you late?

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

Другие вопросы по тегам