*
соответствует своему аргументу ноль или более раз и, таким образом, соответствует пустой строке. Пустая строка (логически) находится между любыми двумя последовательными символами. Следовательно
>>> import re
>>> re.sub(r'x*', 'a', 'bcd')
'abacada'
Что касается косой черты, он не получает специальной обработки:
>>> re.sub(r'/', 'a', 'b/c/d')
'bacad'
Документация описывает синтаксис регулярных выражений в Python. Как видите, косая черта не имеет специальной функции.
Причина, по которой [\w\d\s+-/*]*
также находит запятую, заключается в том, что внутри квадратных скобок тире -
обозначает диапазон . В этом случае вам нужны не все символы от +
до /
, а буквальные символы +
, -
и /
. Так что пишите тире как последний символ: [\w\d\s+/*-]*
. Это должно это исправить.