Я абсолютный новичок в Python. Я создаю безумную игру lib, которая использует функцию замены для замены слов в моем шаблоне. Следующий код не дает правильного вывода, так как шаблон не изменяется в соответствии с пользовательским вводом.

#!/usr/bin/env python
print("lets play a game of mad libs")
print("you will be asked for a word such as noun,adjective,etc.enter the specified word")

template="""I can't believe its already word1! I can't wait to 
put on my word 2 and visit every word3 in my neighbourhood.
This year,I am going to dress up as word4 with word5 word6.
Before I word7,I make sure to grab my word8 word9 to hold all 
of my word10.
Happy word11!"""

word1=input("enter a  holiday")
word2=input("enter a noun")
word3=input("enter a place")
word4=input("enter a person")
word5=input("enter a adjective")
word6=input("enter  body part (plural)")
word7=input("enter a verb")
word8=input("enter a adjective")
word9=input("enter a noun")
word10=input("enter  food")
word11=input("enter a holiday")
template=template.replace("word1",word1)
template=template.replace("word2",word2)
template=template.replace("word3",word3)
template=template.replace("word4",word4)
template=template.replace("word5",word5)
template=template.replace("word6",word6)
template=template.replace("word7",word7)
template=template.replace("word8",word8) 
template=template.replace("word9",word9)
template=template.replace("word10",word10)
template=template.replace("word11",word11)
print(template)

Я знаю, что могу использовать цикл управления потоком, но я просто понимаю манипуляции со строками. Поэтому, пожалуйста, прости мою грязную кодировку.

Проблема с выводом состоит в том, что функция замены заменяет «word1», «word10» и «word11» на один и тот же ввод «word1», потому что «word1» является частью обоих. В любом случае, следует избегать этого вместо простого изменения имени для «word10» "и" word11 ". Если нет, какую альтернативу для замены функции следует использовать?

0
Akhil Sharma 26 Июн 2019 в 07:35

4 ответа

Лучший ответ

По умолчанию string.replace() заменит все совпадающие вхождения. Вот почему word1 соответствует word1, word10 и word11.

Если вы действительно хотите изучить функцию замены, она принимает необязательный аргумент count :

string.replace(oldvalue, newvalue, count)

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

template=template.replace("word_x",word_x, 1)

Таким образом, каждый раз, когда вызывается replace(), он заменяет только первое вхождение.

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

Например, если мы хотим взять 11 строк ввода пользователя и затем объединить их в одну длинную строку:

s = (" ".join(["%s" for i in range(11)]) % tuple([input("Input %d: " % (i+1)) for i in range(11)]))

Конкретно в вашем случае это будет:

template="""I can't believe its already %s! I can't wait to
put on my %s and visit every %s in my neighbourhood.
This year,I am going to dress up as %s with %s %s.
Before I %s,I make sure to grab my %s %s to hold all
of my %s.
Happy %s!"""  # there're 11 placeholders '%s'

word1=input("enter a  holiday")
word2=input("enter a noun")
word3=input("enter a place")
word4=input("enter a person")
word5=input("enter a adjective")
word6=input("enter  body part (plural)")
word7=input("enter a verb")
word8=input("enter a adjective")
word9=input("enter a noun")
word10=input("enter  food")
word11=input("enter a holiday")

user_inputs = (word1, word2, word3, word4, word5, word6, 
               word7, word8, word9, word10, word11)  # length of this tuple is 11

print(template % user_inputs)

Надеюсь это поможет.

2
Dino 26 Июн 2019 в 05:34

Замените в обратном порядке, от самого длинного до самого короткого. word11 может заменить только word11. word10 может заменить только word10, и к тому времени, когда word1 придет, не будет word10 или word11, с которыми можно было бы смешаться.

Кроме того, переключитесь на регулярные выражения, используйте границу слова \b, чтобы решить одну проблему, и попросите дюжину новых, о которых нужно беспокоиться.

0
Amadan 26 Июн 2019 в 04:39

Единственное, что вы можете сделать, это не использовать метод replace(), а отформатировать строку с методом format() и использовать именованные параметры (обратите внимание, что в template теперь есть фигурные скобки {} и внутри них имя параметра, который будет заменен):

template="""I can't believe its already {word1}! I can't wait to
put on my {word2} and visit every {word3} in my neighbourhood.
This year,I am going to dress up as {word4} with {word5} {word6}.
Before I {word7},I make sure to grab my {word8} {word9} to hold all
of my {word10}.
Happy {word11}!"""

word1 = 'abc1'
word2 = 'abc2'
word3 = 'abc3'
word4 = 'abc4'
word5 = 'abc5'
word6 = 'abc6'
word7 = 'abc7'
word8 = 'abc8'
word9 = 'abc9'
word10 = 'abc10'
word11 = 'abc11'

template = template.format(
    word1=word1,
    word2=word2,
    word3=word3,
    word4=word4,
    word5=word5,
    word6=word6,
    word7=word7,
    word8=word8,
    word9=word9,
    word10=word10,
    word11=word11
)

print(template)

Печать :

I can't believe its already abc1! I can't wait to
put on my abc2 and visit every abc3 in my neighbourhood.
This year,I am going to dress up as abc4 with abc5 abc6.
Before I abc7,I make sure to grab my abc8 abc9 to hold all
of my abc10.
Happy abc11!
1
Andrej Kesely 26 Июн 2019 в 05:38

Используйте замену регулярного выражения вместо «простой» замены строки. Регулярные выражения позволяют указать, что вы хотите сопоставить на границах слов. Это решит вашу проблему довольно элегантно. Например:

import re

str = "word1 word2 word3...word11, word12...word123...word1"

str = re.sub(r'\bword1\b', '_replacement1_', str)
str = re.sub(r'\bword12\b', '_replacement12_', str)

print(str)

Результат:

_replacement1_ word2 word3...word11, _replacement12_...word123..._replacement1_

Обратите внимание, что ни одна замена не затрагивает word123, и тот факт, что word1 заменяется как в начале, так и в конце ввода, означает, что замены действительно готовы выполнить несколько замен.

1
Steve 26 Июн 2019 в 04:50