Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用RE将重复字符压缩为单个字符?_Python_Regex_Compression_Repeat - Fatal编程技术网

如何在Python中使用RE将重复字符压缩为单个字符?

如何在Python中使用RE将重复字符压缩为单个字符?,python,regex,compression,repeat,Python,Regex,Compression,Repeat,我希望能够将字符串中任何连续出现的标点字符替换为单个出现的标点字符。 例如: “我去公园了……”我去了 去公园。” “你是认真的吗?”=>“是吗?” 真的?!” 首先想到的是: for char in string.punctuation: text = re.sub( "\\" + char + "+", char, text ) 然而,由于这将在一个重复的过程中运行,我想知道是否有一种方法可以在单个RE中实现这一点,从而使其运行得更快。你觉得怎么样?re.sub(r'([!?)

我希望能够将字符串中任何连续出现的标点字符替换为单个出现的标点字符。 例如:

  • “我去公园了……”我去了 去公园。”
  • “你是认真的吗?”=>“是吗?” 真的?!”
首先想到的是:

for char in string.punctuation:
  text = re.sub( "\\" + char + "+",  char,  text )
然而,由于这将在一个重复的过程中运行,我想知道是否有一种方法可以在单个RE中实现这一点,从而使其运行得更快。你觉得怎么样?

re.sub(r'([!?)\1+,r'\1',text)
你可以试试:

text = re.sub(r"([" + re.escape(string.punctuation) + r"])\1+", r"\1", text)

这将使用
re.escape()
确保标点符号在必要时正确转义。
\1
反向引用指括号内的部分
()
,这是匹配的第一个标点字符。因此,这将用相同的单个字符替换两个或多个重复标点符号的实例。

谢谢,这两个都是很好的快速答案。但我只能接受一个,所以我选择了一个纠正我逃避标点符号字符串的方法的人