Переводчик Python, как заменить всего одно слово

Поэтому я пытаюсь создать переводчик на питоне (на устройстве s60). Итак, что я пытаюсь сделать, так это заменить только одно целое слово, не касаясь других слов. Вот пример

Оригинал: «Коричневая лиса перепрыгивает через собаку по кличке Домовой». Я хочу заменить слово «коричневый» на «дэтлеси» (просто не обращайте внимания, почему). Результат должен быть: «Лисица дэтлеси перепрыгивает через собаку по кличке Брауни». Но вместо этого он также меняет «домовой» в строке, что приводит к: «Лисица смерти перепрыгивает через собаку по имени смертьлеси».

Поскольку я пытаюсь заменить каждое слово, иногда это превращается в нескончаемый парадокс. Пример: «Я тупой». Я пытаюсь изменить «Я» на «Иум», и вот что происходит. "iumumumumumumumumumumumumumumumumumumum.... am stupiuiuiuiuiuiuiuiuiuiuiuiuiuiuiuiuiuiuim..", это в основном изменяет каждое "I" в строке и не остановится, пока в строке не будет "I".

Любая помощь? Спасибо!

Изменить: я уже пробовал «stringhere».replace(), но некоторые части, такие как строчная буква «i», обычно заменяют «i» глупым.

Вот еще пример: «Люди приходят в восторг от гигантского зайца». замена «are» на «iume» вместо «людей волнует гигантский заяц». оно также заменило «зайца», в результате чего «люди были в восторге от гигантского хиуме».

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

translated_sentence=["particulus:people", "iume:are", "geus:getting", "exchantus:excited", "d:at", "qun:the", "gesas:giant", "hsont:hare"]
sentence= "People are getting excited at the giant hare."
for i in translated_sentence do
element=i.split(":")
sentence=sentence.replace(element[1], element[0])

и все равно выдает "particulus uime geus exchantus d qun gesas huime (вместо hsont)"

Я только что понял это. Я просто разделил строку на массив и сохранил форматирование, очистив текущее слово и выполнив string.replace() для исходного слова.

sentence="The quick brown fox jumps over the lazy dog.".split(" ")
result=""

for i in sentence:

cleaned=clean(i) #removes the punctuations and stuff leaving the raw word.

translated=translate(cleaned) #returns the translated word

result=result+i.replace(cleaned,translated)+" "

return result

person Vee Harold    schedule 26.04.2012    source источник


Ответы (5)


Поскольку вы хотите найти только первое вхождение, вам просто нужен способ отслеживать его. Вы можете сделать это многими способами. Вот так просто:

def replacer(original, looking_for, replace_with):
   ''' A straightforward way... '''
   return original.replace(looking_for, replace_with, 1)
   #return regex.sub(replace_with, looking_for, 1)

Число указывает, сколько вхождений вы хотите заменить. Если существует два, и вы ставите 2, будут заменены оба вхождения.

Строка является неизменной, поэтому вы должны переназначить новую строку. Каждый раз, когда вы делаете replace, вы создаете новую строку.

Вы также можете написать цикл для поиска N-го вхождения, если вам не нужен встроенный.

Я рекомендую сделать ваш пост короче (я имею в виду меньше слов и больше подсветки синтаксиса). Отформатируйте его. Поправьте меня, если я не правильно прочитал ваш пост.

person CppLearner    schedule 26.04.2012

Это звучит как сценарий регулярного выражения:

import re
x = "The brown fox jumps over the dog named brownie."
newstring = re.sub(r"(\s+|[:punct:]+|^)brown(\s+|[:punct:]+|$)",r"\1deathlies\2",x, flags=re.IGNORECASE)

Который дает:

>>> print newstring
The deathlies fox jumps over the dog named brownie.

Or:

x = "People are getting excited at the giant hare."
newstring = re.sub(r"(\s+|[:punct:]+|^)are(\s+|[:punct:]+|$)",r"\1iume\2",x, flags=re.IGNORECASE)

Который дает:

>>> print newstring
People iume getting excited at the giant hare.

Первая группа захвата (\s+|[:punct:]+|^) соответствует пробелу, пунктуации или началу строки, а другая группа (\s+|[:punct:]+|$) соответствует концу строки.

Делая замену, \1 и \2 возвращают знаки препинания или пробелы вместе с замененным текстом, делая вещи аккуратными.

PS

Если лень, просто сделайте группы захвата (\W+|^) и (\W+|$)...

person Niall Byrne    schedule 26.04.2012
comment
Спасибо, это сработало... на моем компьютере... не на моем устройстве s60. Все в порядке, хотя я понял это. - person Vee Harold; 26.04.2012

Просто вызовите функцию замены строки

"I am stupid".replace("I", "ium")
person Stan    schedule 26.04.2012
comment
Да, я пробовал это, но некоторые части, такие как строчная буква i, обычно заменяют i глупым. - person Vee Harold; 26.04.2012

У меня сейчас нет Python, но как насчет создания функции для преобразования строки в список. Вы можете удалить пустое пространство, чтобы список был [The, brown, fox, jumps...]. Затем выполните .replace.

person Ci3    schedule 26.04.2012
comment
Это мой текущий метод сейчас. И делать - person Vee Harold; 26.04.2012

Вы хотите заменить точное равное слово. не строка.replace()

замените "есть", но не заменяйте "заяц"

если это так

отредактировано

как сказал @Niall поиск и замена регулярных выражений - лучший инструмент для удовлетворения ваших задач.

в качестве альтернативы, если вы только начали изучать Python, регулярное выражение слишком сложно. просто разделите строку на слова, используя str.split(), а затем переберите слова.

def simply_replace(string, search, replace):
    words = string.split(' ')
    for i in range(len(words)):
        if(words[i].lower() == search):
            words[i] = replace
    return ' '.join(words)

>>> simply_replace("I am stupid", 'i', 'ium')
'ium am stupid'
>>> simply_replace("The brown fox jumps over the dog named brownie.", 'brown', 'deathly')
'The deathly fox jumps over the dog named brownie.'
>>> simply_replace("People are getting excited at the giant hare.", 'are', 'ium')
'People ium getting excited at the giant hare.'
person aifarfa    schedule 26.04.2012