我写了一个非常好的程序,它使用文本文件作为单词库从句子骨架生成句子。一个例子:
骨架
“名词擅长修饰名词”
通过搜索名词和动词的单词库来替换骨架中的“名词”和“动词”,可以使其成为一个句子。我想得到像结果一样的结果
“狗擅长拿棍子”
不幸的是,方便的replace()方法是为速度而设计的,而不是为自定义功能而设计的。我创建了完成从右侧库中选择随机单词的任务的方法,但是做一些像skeleton = skeleton.replace('noun',getNoun(file.txt))的东西用getNoun的单个调用替换'noun'的所有实例(),而不是为每次替换调用它。所以句子看起来像
“狗擅长抓狗”
我如何解决replace()的这个功能,并为每次替换调用我的方法?我的最小长度代码如下。
import random
def getRandomLine(rsv):
#parameter must be a return-separated value text file whose first line contains the number of lines in the file.
f = open(rsv, 'r') #file handle on read mode
n = int(f.readline()) #number of lines in file
n = random.randint(1, n) #line number chosen to use
s = "" #string to hold data
for x in range (1, n):
s = f.readline()
s = s.replace("\n", "")
return s
def makeSentence(rsv):
#parameter must be a return-separated value text file whose first line contains the number of lines in the file.
pattern = getRandomLine(rsv) #get a random pattern from file
#replace word tags with random words from matching files
pattern = pattern.replace('noun', getRandomLine('noun.txt'))
pattern = pattern.replace('verb', getRandomLine('verb.txt'))
return str(pattern);
def main():
result = makeSentence('pattern.txt');
print(result)
main()
答案 0 :(得分:3)
re
模块的re.sub
功能可以完成作业str.replace
,但具有更多功能。特别是,它提供了传递替换函数的能力,而不是字符串。对于每个匹配,函数被调用一次,匹配对象作为参数,并且必须返回将替换匹配的字符串:
import re
pattern = re.sub('noun', lambda match: getRandomLine('noun.txt'), pattern)
这里的好处是增加了灵活性。缺点是如果你不了解正则表达式,那么替换将'noun'
解释为正则表达式的事实可能会引起意外。例如,
>>> re.sub('Aw, man...', 'Match found.', 'Aw, manatee.')
'Match found.e.'
如果您不了解正则表达式,则可能需要使用re.escape
创建一个与您正在搜索的原始文本相匹配的正则表达式,即使该文本包含正则表达式元字符:
>>> re.sub(re.escape('Aw, man...'), 'Match found.', 'Aw, manatee.')
'Aw, manatee.'
答案 1 :(得分:0)
我不知道您是要求编辑代码还是编写新代码,因此我编写了新代码:
import random
verbs = open('verb.txt').read().split()
nouns = open('noun.txt').read().split()
def makeSentence(sent):
sent = sent.split()
for k in range(0, len(sent)):
if sent[k] == 'noun':
sent[k] = random.choice(nouns)
elif sent[k] == 'nouns':
sent[k] = random.choice(nouns)+'s'
elif sent[k] == 'verbing':
sent[k] = random.choice(verbs)
return ' '.join(sent)
var = raw_input('Enter: ')
print makeSentence(var)
运行如下:
$ python make.py
Enter: the noun is good at verbing nouns
the mouse is good at eating cats