python字符串替换,所有可能的组合#2

时间:2015-07-19 14:01:54

标签: python string replace iteration combinations

我的句子如下:

((wouldyou)) give me something ((please))

和一堆关键字,存储在数组/列表中:

keywords["wouldyou"] = ["can you", "would you", "please"]
keywords["please"] = ["please", "ASAP"]

我想用一组存储在数组中的合适字符串替换括号中的每一个变量,并获得所有可能的组合。变量和关键字的数量未定义。

James helped me,代码如下:

def filler(word, from_char, to_char):    
    options = [(c,) if c != from_char else (from_char, to_char) for c in word.split(" ")] 
    return (' '.join(o) for o in product(*options)) 
    list(filler('((?please)) tell me something ((?please))', '((?please))', ''))

它工作得很好,但只用空字符串替换一个特定变量。现在我想通过不同的关键字集来浏览各种变量。期望的结果应该如下所示:

can you give me something please
would you give me something please
please give me something please
can you give me something ASAP
would you give me something ASAP
please give me something ASAP

我想这与to_ch有关,但我不知道如何比较这个地方的列表项。

2 个答案:

答案 0 :(得分:1)

这是Regex船长的工作!

部分,伪代码,解决方案......

一个直接的,虽然效率低(如O(n * m),其中n是要替换的单词数,m是每个单词的平均替换数),这样做的方法是在re模块中使用正则表达式功能要匹配单词,然后使用re.sub()方法将它们交换出来。然后你可以在嵌套循环中嵌入它。所以(假设你首先将你的替换品放入dict或其他东西),它看起来像这样:

for key in repldict:
  regexpattern = # construct a pattern on the fly for key
  for item in repldict[key]:
    newstring = re.sub(regexpattern, item)

等等。只有,你知道,就像正确的语法和东西一样。然后只需将新闻字符串附加到列表中,或将其打印出来,或者其他任何内容。

为了动态创建regexpatterns,字符串连接就应该这样做。就像匹配左侧parens的正则表达式,加上要匹配的字符串,加上正则表达式匹配右侧parens。

如果你这样做,那么你可以通过循环第二个版本的正则表达式模式来处理可选功能,该模式在左边的parens的末尾附加一个问号,然后做你想做的任何事情。

答案 1 :(得分:1)

以下情况可行。它使用itertools.product构建您关键字的所有可能配对(或更多)。

import re, itertools

text = "((wouldyou)) give me something ((please))"

keywords = {}
keywords["wouldyou"] = ["can you", "would you", "please"]
keywords["please"] = ["please", "ASAP"]

# Get a list of bracketed terms
lsources = re.findall("\(\((.*?)\)\)", text)

# Build a list of the possible substitutions 
ldests = []
for source in lsources:
    ldests.append(keywords[source])

# Generate the various pairings
for lproduct in itertools.product(*ldests):
    output = text
    for src, dest in itertools.izip(lsources, lproduct):
        # Replace each term (you could optimise this using a single re.sub)
        output = output.replace("((%s))" % src, dest)

    print output

您可以通过一次replace()调用来避免执行多个re.sub()和分配调用,从而进一步改进它。

此脚本提供以下输出:

can you give me something please
can you give me something ASAP
would you give me something please
would you give me something ASAP
please give me something please
please give me something ASAP

使用Python 2.7进行测试。如果使用多个相同的关键字,您将需要考虑如何解决它。希望你觉得这很有用。