удаляйте только последовательные специальные символы в python, но сохраняйте последовательные [a-zA-Z0-9] и одиночные символы - PullRequest
1 голос
/ 22 января 2020

Как я могу удалить несколько последовательных вхождений всех специальных символов в строке?

Я могу получить код типа

re.sub('\.\.+',' ',string)
re.sub('@@+',' ',string)
re.sub('\s\s+',' ',string)

для отдельных лиц и в В лучшем случае используйте al oop для всех символов в списке, например

from string import punctuation
for i in punctuation:
    to = ('\\'+i+'\\'+i+'+')
    string = re.sub(to,' ',string)

, но я уверен, что есть и эффективный метод.

Я пробовал

re.sub('[^a-zA-Z0-9][^a-zA-Z0-9]+',' ','\n\n.AAA.x.@@+*@#=..xx000..x..\t.x..\nx*+Y.')

но он удаляет все специальные символы, кроме одного, перед которым стоят алфавиты.

строка может иметь различные последовательные специальные символы, такие как 99@aaaa*!@#$., но не такие, как ++--...

1 Ответ

1 голос
/ 22 января 2020

Шаблон, который соответствует всем не алфавитным символам c символов в Python, равен [\W_].

Таким образом, все, что вам нужно, это обернуть шаблон группой захвата и добавить \1+ после он соответствует 2 или более последовательным вхождениям одного и того же не-алфавитного символа c:

text = re.sub(r'([\W_])\1+',' ',text)

В Python 3.x, если вы хотите sh, чтобы сделать шаблон ASCII осведомленным, используйте флаг re.A или re.ASCII:

text = re.sub(r'([\W_])\1+',' ',text, flags=re.A)

Обратите внимание на использование префикса r, который определяет необработанный строковый литерал (так что вам не нужно экранировать \ char).

См. Демонстрационную версию regex . См. Python демо :

import re
text = "\n\n.AAA.x.@@+*@#=..xx000..x..\t.x..\nx*+Y."
print(re.sub(r'([\W_])\1+',' ',text))

Выход:

 .AAA.x. +*@#= xx000 x  .x 
x*+Y.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...