将一系列相同字符替换为该字符在该系列中出现的次数

问题描述 投票:0回答:2

我得到这样的字符串:

AABBBB$CCCDEEE$AABADEE

我想要这样的结果:

2A4B$3CD3E$2ABAD2E

为此,我在字符串数组上创建了一个 for 循环。 效果很好:

import re

string = "AABBBB$CCCDEEE$AABADEE"
out_string = string[:]
k = 1
c_old = ""
for c in string:
    if c_old==c :
        k += 1
    else:
        if k>1:
            s= ""
            for i in range(k):
                s += c_old
            chg = str(k) + c_old
            out_string = re.sub(s, chg, out_string, 1)
        k = 1
    c_old = c

print(out_string)

但是对于很长的字符串,可能需要很长时间。

有没有一种方法可以在不迭代所有字符串的情况下完成我想要的操作,尤其是使用

re
模块?

python regex replace run-length-encoding
2个回答
0
投票

不确定为什么你认为 re.sub() 适合这个。您只需要对源字符串进行相当简单的迭代。

类似这样的:

s = "AABBBB$CCCDEEE$AABADEE"

r = ""
c = 1
p = s[0]

for x in s[1:]:
    if x == p:
        c += 1
    else:
        if c == 1:
            r += p
        else:
            r += f"{c}{p}"
            c = 1
        p = x
else:
    r += p if c == 1 else f"{c}{p}"

print(r)

输出:

2A4B$3CD3E$2ABAD2E

0
投票

回复评论。

也许是这样的:

string = "AABBBB$CCCDEEE$AABADEE"
out_string = ""
k = 1
c_old = ""
for c in string + " ":
    if c_old==c :
        k += 1
    else:
        if k>1:
            out_string = out_string + str(k)
        out_string = out_string + c_old
        k = 1
     c_old = c

print(out_string)
© www.soinside.com 2019 - 2024. All rights reserved.