How to reduce the duplicated characters in a string using Python
是否有一种方法可以将重复的字符减少到特定的数字,例如,如果我们有这个字符串。
预期产量:
例如,如果复制的字符超过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' |
这次只有一组
您可以通过输入字符串进行一次扫描来完成此操作,只需保留当前字符的计数,如果重复次数过多,则不要将其添加到输出中:
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 |
如果你愿意的话,你也许可以开始修补这个。