如何在不替换所有子串的情况下替换子串?蟒蛇

时间:2014-04-06 02:56:20

标签: python regex string replace substring

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

骨架
“名词擅长修饰名词”
通过搜索名词和动词的单词库来替换骨架中的“名词”和“动词”,可以使其成为一个句子。我想得到像结果一样的结果 “狗擅长拿棍子”

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

2 个答案:

答案 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