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

时间:2015-06-18 18:54:58

标签: python python-2.7 dynamic-programming

假设我有一个字符串:

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)

但是语法有问题。

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

由于

3 个答案:

答案 0 :(得分:3)

这是一个解决方案,可以在字符串上运行时正确打印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。如果将每个循环限制为单个替换,则应达到所需的结果。

答案 1 :(得分:1)

作为一种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'

答案 2 :(得分:1)

您应该使用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")