Шаблон [^a-zA-Z0-9:):D)]
ошибочен, поскольку это класс символов, предназначенный для соответствия последовательностям символов.Вам необходимо добавить альтернативу этому регулярному выражению, которая будет соответствовать последовательностям символов.
Чтобы удалить любые знаки препинания, кроме определенного списка смайликов, вы можете использовать
re.sub(r"(:-?[()D])|[^A-Za-z0-9\s]", r"\1" , s)
Или в Python 3.4 истарше, из-за ошибки re.sub
:
re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", lambda x: x.group(1) if x.group(1) else "", s)
Если вам действительно нужно избегать удаления запятых, добавьте ,
в класс отрицательных символов:
re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", r"\1" , s)
^
См. Демонстрационную версию regex .
Подробности
(:-?[()D])
- сопоставления и записи в группу 1 a :
затем необязательный -
, а затем один символ из класса символов: (
, )
или D
(при этом фиксируются такие смайлики, как :-)
, :-(
, :)
, :(
, :-D
, :D
) [^A-Za-z0-9,\s]
- соответствует любому символу, кроме буквы ASCII, цифры, запятой и пробела.Чтобы сделать его полностью поддерживающим Юникод, замените его на (?:[^\w\s,]|_)
.
См. Демонстрационную версию Python 3.5+ :
import re
s = "Hi, this is good :)#"
print( re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", r"\1" , s) )
# => Hi, this is good :)
См. этот Python3.4- демо :
import re
s = "Hi, this is good :)#"
print( re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", lambda x: x.group(1) if x.group(1) else "", s) )
# => Hi, this is good :)