是否有一种方法可以将重复的字符减少到特定的数字,例如,如果我们有这个字符串。
"I liiiiked it, thaaaaaaank you"。
预期产量:"I liiiiked it thaaaank you"。
例如,如果复制的字符超过4个,它应该减少到只有4个字符,如果它小于或等于4,那么单词应该保持不变。
你试过写一些代码来解决这个问题吗?如果是这样,您应该将其编辑到您的问题中。
谢谢你的帮助,我没有真正正确的密码。我只是考虑将字符串拆分成单词,然后将每个单词拆分成字符列表,然后迭代这些字符!!但这是手动的,可能需要很长时间,特别是我的数据非常大!…他们还有其他更容易的方法吗?还是模式?
可以通过循环或正则表达式来实现。这是你的作业,对吧?如果你希望学习的话,也许你需要自己在这里做些工作。
谢谢你,亲爱的,我正在一个项目中工作,这可能对我有帮助。我只是想确保它们是另一种方法,而不是循环,用正则表达式是不可能做到的。
可能不是一个单一的正则表达式,但使用正则表达式可以使用单一字符:re.sub(r'a{4,}', 'a',"I liiiiked it, thaaaaaaank you")将生成'I liiiiked it, thank you'。
@克里斯普,请看我的答案的第二部分,了解如何让它发挥作用所需的额外技巧。
非常感谢你的帮助,克里斯和格尼布尔,真是太棒了。
>>> 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组所取代
这里有一个更简单的方法
>>> re.sub(r"(.)\1{4,}", r"\1"*4, s)
'I liiiiked it, thaaaank you'
这次只有一组(.),这是比赛的第一个字母。后面必须跟同一个字母4或更多倍的\1{4,}。所以它匹配同一个字母中的5个或更多。替换的只是那封信重复了4次。
真的!!太感谢你了,这一行涵盖了一切!…非常感谢……
太棒了-我知道只有一行regex。你能解释一下第二个regex吗?跟第一个一样。
您可以通过输入字符串进行一次扫描来完成此操作,只需保留当前字符的计数,如果重复次数过多,则不要将其添加到输出中:
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)
谢谢,这和我所尝试的差不多,但问题是这种方式需要很长时间…非常感谢你的帮助
@用户2490790:速度可能与Python处理字符串的方式有关,正如我在链接的问题中讨论的那样。你可以尝试一下新的基于列表的版本,但我不能保证它会更快。
不是最好的解决方案-我的regex需要修复…我想
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
如果你愿意的话,你也许可以开始修补这个。
非常感谢!太好了…感谢