如何使用 Python 替换字符串中的成对字符

how to replace pairwise characters in a string using Python

假设我有一个字符串:

x="AAAABBABAABCCABBCA"

我有以下信息:

AAA=1
ABB= ignore/remove from final output
ABA=2
ABC=3
CAB=4
BCA= ignore/remove from final output

所以当我翻译 x 时,输出 y 应该是: y=1234

我试过了:

def fun(x):
    x=x.replace("AAA","1") 
    x=x.replace("ABA","2")
    x=x.replace("ABB","")
    x=x.replace("ABC","3")
    x=x.replace("BCA","")
    x=x.replace("CAB","4")
    print x

但它给了我错误的答案:123CCA

我也试过:

def fun(x):
    z=[]
        for i in range(0,(len(x)+1)):
            if i=="AAA":
                i=i.replace("AAA",1)
        z.append(i)
        elif i=="ABA":
            i=i.replace("ABA",2)
    elif i=="ABB":
            i=i.replace("ABB","")
    elif i=="ABC":
            i=i.replace("ABC",3)
    elif i=="BCA":
            i=i.replace("BCA","")
    elif i=="CAB":
            i=i.replace("CAB","4")
        z.append(i)
    print ",".join(z)

但是语法有问题。

所以主要问题是从头开始检查字符串并替换字符。 请帮助我。

谢谢

这是一个解决方案,可以在 运行 超过您的字符串时正确打印 1234

x = "AAAABBABAABCCABBCA"
newstr = ''
for i in range(0,len(x),3):
    part = x[i:i + 3]
    if part == 'AAA':
        newstr += '1'
    elif part == 'ABA':
        newstr += '2'
    elif part == 'ABC':
        newstr += '3'
    elif part == 'CAB':
        newstr += '4'
print newstr

如果三个字符的序列没有做任何事情,让它检查它就没有多大意义;静静地继续下一个。

如果您决定使用 str.replace 替换代码中的这些字符串,您应该查看可选的第三个参数 count。如果您将它限制为每个循环的单个替换,您应该会达到您想要的结果。

作为一种 pythonic 方式,您可以使用 grouper function 根据特定长度对字符串进行分组,并将您的模式放入字典中:

>>> d ={'ABA': '2', 'ABB': '', 'ABC': '3', 'AAA': '1', 'BCA': '', 'CAB': '4'}
>>> def grouper(iterable, n, fillvalue=None):
...     "Collect data into fixed-length chunks or blocks"
...     # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
...     args = [iter(iterable)] * n
...     return izip_longest(fillvalue=fillvalue, *args)
... 
>>> from itertools import izip_longest 

>>> ''.join([d.get(''.join(i),'') for i in grouper(x,3)])
'1234'

您应该使用 dict 来存储您的规则,这样您就不必在每次规则更改时都更新代码。您可以简单地更新规则字典,您的函数应该继续工作。

rules = {'AAA': '1',
         'ABB': '',
         'ABA': '2',
         'ABC': '3',
         'CAB': '4',
         'BCA': ''}

def fun(str, rules=rules, substr_length=3):
    newstr = []
    for i in range(0, len(str), substr_length):
        substr = str[i:i+substr_length]
        newstr.append(rules[substr])

    return ''.join(newstr)

print fun("AAAABBABAABCCABBCA")