所以,我正在为madlibs制作一个Python 3小程序。到目前为止,我有它,所以它读取一个文本文件,从中提取一个随机的故事,并将该故事分成一个列表,以便通过它进行搜索。一切都很好。我将这些故事格式化,以便在需要单词时使用(名词),(副词),(名称)等等。但是,我在替换这些字符串时遇到了一些问题。这是一个例子:
>>> 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.
答案 0 :(得分:2)
要解决您的方法存在的问题,我需要查看完整的代码,但我还有其他建议。
你实际上可以在这里使用正则表达式,这允许在一行(几乎)中进行替换。
In [1]: import re
In [2]: story = ''' 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).'''
In [3]: def replace(match):
...: return input('{}: '.format(match.group()))
...:
In [4]: print(re.sub('\((noun|name|adjective|place)\)', replace, story))
(noun): monster
(name): Strange
(name): Strange
(adjective): yellow
(noun): eatery
(place): Times Square
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.
re.sub()
接受一个可调用的替换,我们用它来调用input()
并从匹配中提取提示。
编辑以匹配括号中的任何词组,您只需更改模式,例如:
print(re.sub('\(([^()]*)\)', replace, story))
答案 1 :(得分:0)
text = """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)."""
match = ['monster', 'Strange', 'Strange', 'yellow', 'eatery', 'Times Square']
splitted = text.split()
for i, item in enumerate(splitted):
if '(' in item:
matched = match.pop(0)
if not item.endswith(')'):
matched = '{}{}'.format(matched, item[:-1])
splitted[i] = matched
print ' '.join(splitted)
答案 2 :(得分:0)
好的,为了解决我只想要一次询问每个相同项目的问题,我不得不重写一点。我还在使用@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()
函数在括号"之间找到与"的正则表达式匹配的所有实例。并构建一个初始列表。然后,我遍历该列表并将每个唯一标记放入新列表中以消除重复。我遍历新的令牌列表,并用提示的输入替换每个匹配。这正是我想要的applet,因为它消除了重复的提示。