gpt4 book ai didi

python - 如何在不同时替换所有子字符串的情况下替换子字符串? Python

转载 作者:行者123 更新时间:2023-11-28 16:38:30 24 4
gpt4 key购买 nike

我写了一个非常好的程序,它使用文本文件作为词库,从句子骨架中生成句子。一个例子:

骨架
“名词擅长名词动词”
可以通过搜索名词和动词的词库来替换骨架中的“名词”和“动词”来造句。我想得到这样的结果
“这只狗擅长捡棍子”

不幸的是,方便的 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()

最佳答案

re 模块的 re.sub function 完成 str.replace 所做的工作,但具有更多的能力。特别是,它提供了为替换传递函数而不是字符串的能力。对于每个匹配对象作为参数的匹配调用一次该函数,并且必须返回将替换匹配的字符串:

import re
pattern = re.sub('noun', lambda match: getRandomLine('noun.txt'), pattern)

这里的好处是增加了灵 active 。不利的一面是,如果您不知道正则表达式,替换将 '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.'

关于python - 如何在不同时替换所有子字符串的情况下替换子字符串? Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22889462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com