繁体   English   中英

我如何使用正则表达式从字符串中删除重复的字符

[英]How I can use regex to remove repeated characters from string

我有一个字符串,如下所示,我试图删除类似的连续字符。

import re
input = "abccbcbbb";
for i in input :
    input = re.sub("(.)\\1+", "",input);
print(input)

现在我需要让用户指定 k 的值。 我正在使用以下 python 代码来执行此操作,但我收到错误消息TypeError: can only concatenate str (not "int") to str

import re
input = "abccbcbbb";
k=3
for i in input :
   input= re.sub("(.)\\1+{"+(k-1)+"}", "",input)
print(input)

for i in input:不满足您的需要。 i是输入字符串中的每个字符,你的re.sub应该将整个输入作为一个字符序列。

如果你打算匹配特定数量的字符,你应该去掉\1之后的+量词。 限制{min,} / {min,max}量词应该放在它修改的模式之后。

此外,在定义正则表达式时使用原始字符串文字更方便。

您可以使用

import re
input_text = "abccbcbbb";
k=3
input_text = re.sub(fr"(.)\1{{{k-1}}}", "", input_text)
print(input_text)
# => abccbc

请参阅此 Python 演示

fr"(.)\1{{{k-1}}}"原始 f 字符串文字将转换为(.)\1{2}模式。 在 f 字符串中,您需要双花括号来表示文字花括号,并且您不需要再次转义\1 ,因为它是r aw 字符串文字。

如果我是你,我宁愿按照之前的建议去做。 但由于我已经花时间回答了这个问题,所以这里是我手工制作的解决方案。

下面描述的模式创建了一个名为“letter”的命名组。 这个组更新迭代,所以首先它是 a,然后是 b,等等。然后它向前看组“字母”的所有重复(为每个字母更新)。

所以它找到所有重复字母组并用空字符串替换它们。

import re

input = 'abccbcbbb'
result = 'abcbcb'
pattern = r'(?P<letter>[a-z])(?=(?P=letter)+)'
substituted = re.sub(pattern, '', input)
assert substituted == result

只是为了确保我的问题是正确的,你的意思是将“abccbcbbb”变成“abcbcb”,只删除连续的重复字符。 您是否需要使用正则表达式? 您可能会做一个简单的列表理解。 我的意思是这是一种非常简单和肮脏的方法,但你可以把

input = "abccbcbbb"
input = list(input)
previous = input.pop(0)
result = [previous]
for letter in input:
    if letter != previous : result += letter
    previous = letter
result = "".join(result)

并且使用这样的方法,您可以通过一些修改 id assume 使其更易于阅读和更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM