Замена нескольких акцентированных букв в строке одной буквой с использованием понимания списка - PullRequest
2 голосов
/ 16 марта 2020

У меня есть функция, которая принимает строку и имеет параметры для игнорирования регистра и игнорирования ударений. Кажется, все работает при использовании for l oop для параметра ignore_accents. При попытке использовать понимание списка, оно больше не возвращает ожидаемое значение.

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

def count_letter_e_text(file_text, ignore_accents, ignore_case):

    e = "e"
    acc_low_e = ["é", "ê", "è"]

    if ignore_case is True:
        file_text = file_text.lower()

    if ignore_accents is True:

        # this works
        #file_text = file_text.replace("é", e).replace("ê", e).replace("è", e)

        # this works too
#         for ch in acc_low_e:
#             if ch in file_text:
#                 file_text = file_text.replace(ch, e)

        # does not work as list comprehension
        #file_text = [ch.replace(ch, e) for ch in file_text if ch in acc_low_e] # gives count of 6
        file_text = [file_text.replace(ch, e) for ch in acc_low_e if ch in file_text] # gives count of 0

    num_of_e = file_text.count(e) 

    return num_of_e

Программа драйвера:

text = "Sentence 1 test has e, é, ê, è, E, É, Ê, È"
# expecting count of 12; using list comprehension it is 0
text_e_count = count_letter_e_text(text, True, True)
text_e_count

Ответы [ 2 ]

3 голосов
/ 16 марта 2020

Понимание списка создает список. Здесь вы можете создать список символов и присоединиться к нему:

file_text = ''.join([t if t not in acc_low_e else 'e' for t in file_text])
0 голосов
/ 16 марта 2020

Я бы использовал замену регулярного выражения здесь:

acc_low_e = ["é", "ê", "è"]
regex = '|'.join(acc_low_e)
file_text = 'café mocha'
print(file_text)
file_text = re.sub(regex, 'e', file_text)
print(file_text)
...