2011-11-29 48 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']