Python有选择地替换字符串中的字符

2024-05-16 19:26:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含固定字符的字符串。我可以用另一个字符或字符串替换它来生成字符串的排列吗?? 我有这样的东西:

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

我想要这样的输出:

^{pr2}$

有办法吗?在


Tags: 字符串字符办法pr2designatedstringthruputoughreplacerstring
3条回答

根据您在问题中给出的输入,将生成所需的列表:

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)]

更多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行的难看的转换。在

这里有一个有趣的方法,尽管我还是会使用itertools解决方案。在

请注意,您生成的字符串列表在道义上是一个二叉树:在字符串中替换字符的每个实例中,您要么忽略它(“goleft”)要么替换它(“goright”)。因此,您可以用替换字符串生成一个二叉树结构。在二叉树的叶子上行走很容易。在

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

示例:

^{pr2}$

相关问题 更多 >