Python 用用户输入替换括号中的关键字

Python 用用户输入替换括号中的关键字,python,Python,所以,我正在为madlibs制作一个小的Python3小程序。到目前为止,我已经有了它,它可以读取一个文本文件,从中提取一个随机的故事,并将该故事拆分为一个列表,以便在其中进行搜索。这一切都很好。我把故事格式化,以便在需要单词的地方,它使用(名词),(副词),(名字)等等。但是,我在替换这些字符串时遇到了一些问题。以下是一个例子: >>> for i in range(0,len(poss)): ... if '(' in poss[i]: poss[i] = input('

所以,我正在为madlibs制作一个小的Python3小程序。到目前为止,我已经有了它,它可以读取一个文本文件,从中提取一个随机的故事,并将该故事拆分为一个列表,以便在其中进行搜索。这一切都很好。我把故事格式化,以便在需要单词的地方,它使用(名词),(副词),(名字)等等。但是,我在替换这些字符串时遇到了一些问题。以下是一个例子:

>>> for i in range(0,len(poss)):
...  if '(' in poss[i]: poss[i] = input('{0}: '.format(poss[i].replace('(','').replace(')','')))
...
noun: monster
name.: Strange
name: Strange
adjective: yellow
noun!: eatery
place.
: Times Square
>>> poss = ' '.join(poss)
>>> print(poss)
                               Back to the Future

Marty was an innocent, young monster and made friends with the local scientist,
Doc Strange Doc Strange was a bit off, but he was one yellow genius. One day,
he told Marty that he had an invented a eatery Of course, Marty had to see it
in action. Late that night, they met at Times Square
它在每个对象中搜索“(”字符,然后用单词替换整个对象。它不保留可能涉及的标点符号。此外,您可以看到标点符号/换行符被保留,并在
input()时显示
被调用。如何有效地仅替换括号中包含的子字符串

以下是从文件中提取的原始文本供参考:

                               Back to the Future

Marty was an innocent, young (noun) and made friends with the local scientist,
Doc (name). Doc (name) was a bit off, but he was one (adjective) genius. One day,
he told Marty that he had an invented a (noun)! Of course, Marty had to see it
in action. Late that night, they met at (place).
我的预期结果是:

                               Back to the Future

Marty was an innocent, young monster and made friends with the local scientist,
Doc Strange. Doc Strange was a bit off, but he was one yellow genius. One day,
he told Marty that he had an invented a eatery! Of course, Marty had to see it
in action. Late that night, they met at Times Square.

为了解决您的方法的问题,我需要查看完整的代码,但我有另一个建议

实际上,您可以在这里使用正则表达式,这允许在一行中进行替换(几乎)

接受可调用作为替换,我们使用从匹配中提取的提示符调用
input()

编辑:要匹配括号中的任何短语,只需更改模式即可,例如:

print(re.sub('\(([^()]*)\)', replace, story))

为了解决您的方法的问题,我需要查看完整的代码,但我有另一个建议

实际上,您可以在这里使用正则表达式,这允许在一行中进行替换(几乎)

接受可调用作为替换,我们使用从匹配中提取的提示符调用
input()

编辑:要匹配括号中的任何短语,只需更改模式即可,例如:

print(re.sub('\(([^()]*)\)', replace, story))

好的,为了解决我只想要求每个相同项目一次的问题,我必须重写一点。我仍然使用@Lex提供的正则表达式,因此感谢他。但是,我不再使用他的
re.sub()
方法

import re
l1 = re.findall('\(([^()]*)\)',story)
l2 = []
for i in l1:
 if i not in l2:
  l2.append(i)
for i in l2:
 substr = '({})'.format(i)
 word = input('{}: '.format(i))
 story = story.replace(substr,word)


print(story)

findall()
函数查找与“括号之间”的正则表达式匹配的所有实例并构建一个初始列表。然后,我遍历该列表,并将每个唯一的令牌放入一个新列表以消除重复。我遍历新的令牌列表,并用提示输入替换每个匹配项。这正是我的小程序所希望的,因为它消除了重复的提示。

好的,来解决我只需要的问题为了一次请求每个相同的项,我必须重写一点。我仍然使用@Lex提供的正则表达式,因此感谢他。但是,我不再使用他的
re.sub()
方法

import re
l1 = re.findall('\(([^()]*)\)',story)
l2 = []
for i in l1:
 if i not in l2:
  l2.append(i)
for i in l2:
 substr = '({})'.format(i)
 word = input('{}: '.format(i))
 story = story.replace(substr,word)


print(story)

findall()
函数查找与“括号之间”的正则表达式匹配的所有实例并构建一个初始列表。然后,我遍历该列表,并将每个唯一的标记放入一个新列表中以消除重复。我遍历新的标记列表,并用提示输入替换每个匹配项。这正是我的小程序所需要的,因为它消除了重复的提示。

您正在使用
noon
进行两次dif不同的目的,所以最直接的解决方案不可能奏效。@RadLexus查看我如何解决问题的答案。这里似乎很简单;)。您使用
名词有两个不同的目的,所以最直接的解决方案不可能奏效。@RadLexus查看我如何解决问题的答案。看起来很直截了当;)。这个不错!我会使用它,但我编写的一些madlib使用抽象提示,例如(第1行中的名词)。请参阅我的解决方案,了解我是如何克服此问题的。@CasperTheFriendlyCode您可以轻松地使其与括号中的任何短语匹配,请参阅我的编辑。您使用哪种Python进行此操作?我试图将其作为.py文件运行,而不是使用python 3.5.2通过解释器运行,它只是打印原始故事。@CasperTheFriendlyCode我也使用了3.5解释器来编写答案。但是我也不明白为什么它不能在其他版本上工作。即使通过解释器运行它也无法调用input()函数,只是打印未替换的故事。看这个好!我会使用它,但我编写的一些madlib使用抽象提示,例如(第1行中的名词)。请参阅我的解决方案,了解我是如何克服此问题的。@CasperTheFriendlyCode您可以轻松地使其与括号中的任何短语匹配,请参阅我的编辑。您使用哪种Python进行此操作?我试图将其作为.py文件运行,而不是使用python 3.5.2通过解释器运行,它只是打印原始故事。@CasperTheFriendlyCode我也使用了3.5解释器来编写答案。但是我也不明白为什么它不能在其他版本上工作。即使通过解释器运行它也无法调用input()函数,只是打印未替换的故事。看见