使用一组规则替换字符串中的多个字符

时间:2017-10-24 03:02:41

标签: python string python-3.x

将向用户询问applyRules中的规则,但它不起作用[“character1:substitution”, “character2:substitution”]

应该起作用

当用户放置['b:c','c:d']时,会打印c,c。但是,当char为d

时,它应该打印b

该函数将单个字符和一组规则作为列表。

这就是我到目前为止所写的内容

def applyRules(char, rules):
    for rule_list in (rule.split(':') for rule in rules):
        char = char.replace(rule_list[0], rule_list[1])
    return char

我应该添加什么才能使其正常工作?

2 个答案:

答案 0 :(得分:1)

如果您有多个规则,这会变得很麻烦。只要您对单个字符进行替换,就可以使用str.translate轻松完成此操作。但是,这并没有解决链式替换的问题,所以你必须使用一个while循环,直到没有更多的变化。

def applyRules(string, rules):
    mapping = str.maketrans(dict(x.split(':') for x in rules))

    while True:
        new = string.translate(mapping)
        if string == new:
            break
        string = new

    return new
In [1308]: applyRules('bbbbb', ['b:c', 'c:d'])
Out[1308]: 'ddddd'

单个字符替换
对于涉及单个字符的替换,解决方案简化了。您可以使用get的字典:

def applyRules(char, rules):
    mapping = dict(x.split(':') for x in rules)

    while True:
        new = mapping.get(char, char)
        if char == new:
            break
        char = new

    return new

这应该更简单。

答案 1 :(得分:0)

您需要应用每个规则并同时保留新字符串,因为字符串在python中是不可变的。您可以使用str类的translate。以下代码工作

def applyRules(char, rules):
    modified = char

    for rule in rules:
        r = rule.split(':')
        table = str.maketrans({r[0]:r[1]})
        modified = modified.translate(table)

    return modified

print(applyRules('bbbbb',['b:c','c:d'])) #prints 'ddddd'
print(applyRules('abdecbc',['b:c','c:d'])) #prints 'addeddd'