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