регулярное выражение только специальные символы
Как составить регулярное выражение:
Выбрать только специальные символы, т.е. надо исключить любые буквы, числа и пробельные символы. Вариант перечисление символов в [ ] не подходит.
или как создать два условия? (к примеру используя \S и \W)
Спасибо за помощь.
Ответы (2 шт):
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]|_)+', ',_') -> [',_']
Для удаления всех специальных символов кроме пробельных, чтобы остались только буквы и цифры, можно использовать
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}) символов.