>>> import re
>>> test = "i am test-ing., i am test.ing-, i am_, test_ing,"
>>> re.sub(r'([^\w\s]|_)+(?=\s|$)', '', test)
'i am test-ing i am test.ing i am test_ing'
Соответствует одному или нескольким не алфавитно-цифровым символам ([^\w\s]|_
), за которыми следует либо пробел (\s
), либо конец строки ($
). Конструкция (?= )
является предварительным утверждением: она гарантирует, что совпадающее пространство не включено в совпадение, поэтому оно не заменяется; заменяется только [\W_]+
.
Хорошо, но почему [^\w\s]|_
, спросите вы? Первая часть соответствует любому, что не является буквенно-цифровым или подчеркиванием ([^\w]
) или пробелом ([^\s]
), то есть символами пунктуации. За исключением того, что мы хотим исключить подчеркивания, поэтому мы включаем в них те, которые |_
.