在python中如何将字符重复输出_如何使用Python减少字符串中的重复字符

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

"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

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

非常感谢!太好了…感谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值