如何使用Python减少字符串中的重复字符

How to reduce the duplicated characters in a string using Python

是否有一种方法可以将重复的字符减少到特定的数字,例如,如果我们有这个字符串。

"I liiiiked it, thaaaaaaank you"

预期产量:"I liiiiked it thaaaank you"

例如,如果复制的字符超过4个,它应该减少到只有4个字符,如果它小于或等于4,那么单词应该保持不变。


1
2
3
4
>>> import re
>>> s="I liiiiked it, thaaaaaaank you"
>>> re.sub(r"(.)(\1{3})(\1+)", r"\1\2", s)
'I liiiiked it, thaaaank you'

此正则表达式查找3个组。

第一个是任何字符。第二个是同一个字符的3个以上,第三个是第一个字符的一个或多个。

然后这3组被第1组和第2组所取代

这里有一个更简单的方法

1
2
>>> re.sub(r"(.)\1{4,}", r"\1"*4, s)
'I liiiiked it, thaaaank you'

这次只有一组(.),这是比赛的第一个字母。后面必须跟同一个字母4或更多倍的\1{4,}。所以它匹配同一个字母中的5个或更多。替换的只是那封信重复了4次。


您可以通过输入字符串进行一次扫描来完成此操作,只需保留当前字符的计数,如果重复次数过多,则不要将其添加到输出中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
input_string ="I liiiiked it, thaaaaaaank you"

max_reps = 4
prev_char = None
rep_count = 0
output =""

for char in input_string:
    if not char == prev_char:
        rep_count = 1
        prev_char = char
        output += char
    else:
        if rep_count < max_reps:
            rep_count += 1
            output += char
        else:
            rep_count += 1

通过避免字符串串联可能更快的版本(请参见本问题):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
input_string ="I liiiiked it, thaaaaaaank you"

max_reps = 4
prev_char = None
rep_count = 0
output_list = []

for char in input_string:
    if not char == prev_char:
        rep_count = 1
        prev_char = char
        output_list.append(char)
    else:
        if rep_count < max_reps:
            rep_count += 1
            output_list.append(char)
        else:
            rep_count += 1

output = ''.join(output_list)


不是最好的解决方案-我的regex需要修复…我想

1
2
3
4
5
6
7
8
9
10
11
12
import re

def rep(o):
    g = o.group(0)
    if len(g) > 4:
        return g[0:3]
    return g

foo = 'iiiiiiii liiiiiiikkkkkkkkkeeeee fooooooddd'
foo1 = re.sub(r'(\w)\1+', rep, foo)

# iiii liiiikkkkeeee fooooddd

如果你愿意的话,你也许可以开始修补这个。