Как я могу сжать повторяющиеся символы в один символ, используя RE в Python? - PullRequest
2 голосов
/ 20 декабря 2010

Я хочу иметь возможность заменить любые последовательные вхождения знаков препинания в строке одним вхождением.Например:

  • "Я пошел в парк ...." => "Я пошел в парк."
  • "Ты серьезно ?? !! ???!»=> «Ты серьезно?!?!»

Первое, что пришло в голову, было:

for char in string.punctuation:
  text = re.sub( "\\" + char + "+",  char,  text )

Однако, так как это будет работать в повторяющихсяпроцесс, мне было интересно, есть ли способ добиться этого в одном RE, чтобы он работал быстрее.Что ты думаешь?

Ответы [ 2 ]

4 голосов
/ 20 декабря 2010

Вы можете попробовать:

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

При этом используется re.escape(), чтобы обеспечить правильное экранирование знаков препинания при необходимости.Обратные ссылки \1 относятся к части в скобках (), которая соответствует символу пунктуации first .Таким образом, это заменяет экземпляры двух или более повторяющихся знаков препинания одним и тем же символом.

3 голосов
/ 20 декабря 2010

re.sub(r'([!?.])\1+', r'\1', text)

...