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

Как составить регулярное выражение:

Выбрать только специальные символы, т.е. надо исключить любые буквы, числа и пробельные символы. Вариант перечисление символов в [ ] не подходит.

или как создать два условия? (к примеру используя \S и \W)

Спасибо за помощь.


Ответы (2 шт):

Автор решения: Stanislav Volodarskiy

re.findall(r'[^\s\w]|_', text) - это выражение возвращает список всех символов кроме цифр, букв и пробельных символов. _ включена как отдельная альтернатива так как \w включает его в себя.

Если вы хотите группировать знаки препинания вместе: re.findall(r'(?:[^\s\w]|_)+', text).

NB Спасибо Wiktor Stribiżew за замечания и правки в этом вопросе. Регулярные выражения не так просты.

P.S. При работе с группами ([^\s\w]|_)+ не работает ожидаемым образом. Сравните:

re.findall(r'([^\s\w]|_)+'  , ',_')  -> ['_']
re.findall(r'(?:[^\s\w]|_)+', ',_')  -> [',_']
→ Ссылка
Автор решения: Wiktor Stribiżew

Для удаления всех специальных символов кроме пробельных, чтобы остались только буквы и цифры, можно использовать

re.sub(r'(?:[^\w\s]|_)+', '', text)

Подробности

  • (?: - начало незахватывающей подмаски:
    • [^\w\s] - любой символ, отличный от букво-цифрового и символа нижнего подчёркивания
    • | - или
    • _ - символ нижнего подчёркивания (он ведь тоже специальный)
  • )+ - конец незахватывающей подмаски, один и более повторов.

См. пример работы выражения.

Если вы можете установить библиотеку (модуль) PyPi regex (pip install regex / pip3 install regex в консоли), тогда вы сможете использовать

import regex
text = r"""Удалите, пожалуйста, `!@#$%^&*()_+-=[]{};':"|,.<>\/?~,!?;:()[]【】"""
print( regex.sub(r"[\p{P}\p{S}]+", "", text) )

См. пример работы кода и работы регулярного выражения.

Шаблон [\p{P}\p{S}]+ находит один и более пунктуационных (\p{P}) и математических (\p{S}) символов.

→ Ссылка