Я пытаюсь подчеркнуть слово в выражении if python3 - PullRequest
3 голосов
/ 04 апреля 2020
def translate(phrase):
    translation = ""
    verb = "eau"
    print(translation)
    for letter in phrase:
        if letter.lower() in verb:
            if letter.isupper():
                translation = translation + " \u0332"
            else:
                translation = translation + " \u0332"
        else:
            translation = translation + letter

    return translation


print(translate(input("Enter a phrase: ")))

Я пытаюсь сделать так, чтобы, если он находит слово «eau» вместе (не если «a» или «e» один), он подчеркнет его, но проблема в том, что он просто удаляет его, а затем добавляет подчеркивание

Enter a phrase: MEAU

M ̲ ̲ ̲

Я хочу не только это для "eau", я хочу сделать это для других, например, если я добавлю больше слов ("eim") в глагол.

Спасибо за вашу помощь

Ответы [ 3 ]

1 голос
/ 04 апреля 2020

Вы можете сделать это, используя re.sub с функцией замены, которая вставляет подчеркивание перед каждой буквой соответствующей подстроки. Это позволяет вам сопоставлять подстроку независимо от регистра:

import re

def underline(match):
    return '\u0332'.join([''] + list(match.group()))

def underline_substring(substring, sentence):
    return re.sub(substring, underline, sentence, flags=re.I)

print(underline_substring('eau', "Eau, c'est beau"))

Вывод:

E̲a̲u, c'est b̲e̲a̲u

(выглядит в терминале лучше, чем здесь, на веб-странице, подчеркивания действительно под символами)

1 голос
/ 04 апреля 2020

вы можете использовать re.sub :

import re 
def translate(phrase, words):
    return re.sub('|'.join(words), lambda x: ''.join(e + '\u0332' for e in x.group()), phrase)

translate(input("Enter a phrase: "), words = ['eau', 'vert'])
# input:  Une eau pure pour que le vert dure!

выход:

'Une e̲a̲u̲ pure pour que le v̲e̲r̲t̲ dure!'
0 голосов
/ 04 апреля 2020

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

Вместо этого я проверяю все слова на соответствие вашей цели и переводим только это.

    def translate_word(verb):
        translation = ""
        for letter in verb:
            translation = translation + letter + "\u0332"
        return translation

    def translate(phrase, verb):

        if isinstance(verb, str):
            verb = verb.split()
        elif isinstance(verb, (list, set, tuple)):
            pass
        else:
            raise TypeError(f"unknown type for verb:{type(verb)}")

        #convert the verb into a set, casefold for upper/lower/accented chars
        verbs = {v.casefold() for v in verb }

        li = []
        for word in phrase.split():
            #upper/lowercase and accented chars
            if word.casefold() in verbs:
                li.append(translate_word(word))
            else:
                li.append(word)

        return " ".join(li)


вывод:

второй тест имел ("eau", "si") в качестве входных глаголов.


Une e̲a̲u̲ pure pour que le vert dure, c'est si beau!
Une E̲a̲u̲ pure pour que le vert dure, c'est s̲i̲ beau!

Нет регулярные выражения были повреждены в этой программе .

Некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них есть две проблемы.

Наконец, phrase.split() - приблизительная стратегия. Если у вас есть фраза с двумя пробелами, как иногда используется после двоеточий, вы бы потеряли один пробел таким образом. Или, если бы у вас было une eau, si douce, вы бы пропустили это совпадение глаголов.

См. Как сохранить разделители Regex.Split? для более комплексного подхода, подходящего на основе регулярных выражений. , Нечто, основанное на регулярном выражении, например \s+,., будет вашим предпочтительным разделителем слов вместо str.split().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...