有没有办法将重复的字符减少到特定的数字,例如如果我们有这个字符串。
"I liiiiked it, thaaaaaaank you"
预期输出:"I liiiiked it thaaaank you"
因此,如果重复字符超过 4,例如,它应该减少到只有四个字符,如果它小于或等于 4,那么这个词应该保持不变。
有没有办法将重复的字符减少到特定的数字,例如如果我们有这个字符串。
"I liiiiked it, thaaaaaaank you"
预期输出:"I liiiiked it thaaaank you"
因此,如果重复字符超过 4,例如,它应该减少到只有四个字符,如果它小于或等于 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 组被替换为第 1 组和第 2 组
这是一个更简单的方法
>>> re.sub(r"(.)\1{4,}", r"\1"*4, s)
'I liiiiked it, thaaaank you'
这次只有一个 group (.)
,这是比赛的第一个字母。后面必须跟同一个字母 4 次或更多次\1{4,}
。所以它匹配5个或更多相同的字母。替换只是那个字母重复了 4 次。
您可以通过对输入字符串进行一次扫描来执行此操作,只需保留当前字符的计数,如果重复次数过多,则不要将其添加到输出中:
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
通过避免字符串连接可能更快的版本(请参阅此问题):
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)
不是最好的解决方案 - 我的正则表达式需要修复......我认为
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
如果你愿意的话,你可能可以开始修改这个。