2011-11-29 107 views
2

我有一個字符串,它包含一個固定的字符。我可以通過用另一個字符或字符串替換字符串來生成一個字符串嗎? 說,我有這樣的事情:Python從字符串中有選擇地替換字符

designatedstring="u" 
replacerstring="ough" 
s="thruput" 

我要等的輸出:

l=["throughput","thrupought","throughpought"] 

有沒有辦法做到這一點?

+0

發生什麼= u和,你要輸出AuuA的輸出有一個或兩個AUUUA? – ideerge

回答

4

itertools糖:

>>> parts = s.split(designatedstring) 
>>> num = len(parts) - 1 
>>> replacements = itertools.product([designatedstring, replacerstring], repeat=num) 
>>> replacements = list(replacements) 
>>> replacements.remove((designatedstring,) * num) 
>>> for r in replacements: 
...  print ''.join(itertools.chain(*zip(parts, r + ('',)))) 
... 
thrupought 
throughput 
throughpought 

如果你能在結果與原始字符串承擔,你可以省略4行和5行的醜陋轉換。

+0

你比我快了幾秒鐘! :o +1 – mac

-1

在你的問題中給出的輸入,這將產生請求名單:

s="thruput" 
designatedstring="u" 
replacerstring="ough" 

l = [] 
for i in range(len(s)): 
    if s[i] == designatedstring: 
     l += [s[:i] + replacerstring + s[i + 1:]] 

l += [s.replace(designatedstring, replacerstring)] 
+0

嘗試用's =「tututu」' – DrTyrsa

+0

@DTTyrsa它會工作,但它不會創建「toughtoughtu」,「toughtutough」和「tutoughtough」字符串。在技​​術上沒有在問題中指定。 ;) –

0

這是一個有趣的方式來做到這一點,雖然我仍然與itertools解決方案。

請注意,您生成的字符串列表在道德上是二叉樹:在字符串中替換字符的每個實例中,您要忽略它(「向左」)或替換它(「向右」)。因此,您可以使用替換字符串創建二叉樹結構。走二叉樹的葉子很容易。

class ReplacementTree(object): 
    def __init__(self, s, src, target, prefix=""): 
     self.leaf = src not in s 
     if 1 == len(s.split(src, 1)): 
      self.head, self.tail = s, "" 
     else: 
      self.head, self.tail = s.split(src, 1) 
     self.prefix, self.src, self.target = prefix, src, target 

    @property 
    def value(self): 
     if self.leaf: 
      return self.prefix + self.head 

    @property 
    def left(self): 
     if self.leaf: 
      return None 
     else: 
      return ReplacementTree(self.tail, 
            self.src, 
            self.target, 
            prefix=self.prefix + self.head + self.src) 

    @property 
    def right(self): 
     if self.leaf: 
      return None 
     else: 
      return ReplacementTree(self.tail, 
            self.src, 
            self.target, 
            prefix=self.prefix + self.head + self.target) 

def leaves(tree): 
    if tree.leaf: 
     yield tree.value 
    else: 
     for leaf in leaves(tree.left): 
      yield leaf 
     for leaf in leaves(tree.right): 
      yield leaf 

例如:如果指定的更換是UU

>>> x = repltree.ReplacementTree("thruput", "u", "ough") 
>>> list(repltree.leaves(x)) 
['thruput', 'thrupought', 'throughput', 'throughpought']