Прямая косая черта в регулярном выражении Python

Я пытаюсь использовать регулярное выражение Python для поиска математического выражения в строке. Проблема в том, что косая черта, похоже, делает что-то неожиданное. Я бы подумал, что [\w\d\s+-/*]* будет работать для поиска математических выражений, но по какой-то причине он также находит запятые. Немного экспериментирования показывает, что прямая косая черта является виновником. Например:

>>> import re
>>> re.sub(r'[/]*', 'a', 'bcd')
'abacada'

По-видимому, сперва косые черты совпадают между символами (даже если они находятся в классе символов, но только при наличии звездочки). Обратные косые черты не ускользают от них. Я некоторое время охотился и не нашел на нем никакой документации. Любые указатели?

Ответ 1

Посмотрите здесь для документации в модуле Python re.

Я думаю, что это не /, а скорее - в вашем первом классе символов: [+-/] соответствует +, / и любому значению ASCII между ними, которые включают в себя запятую.

Возможно, это подсказка из справки docs:

Если вы хотите включить ']' или '-' внутри набора, перед ним следует обратная косая черта или поместить его в качестве первого символа.

Ответ 2

Вы говорите это, чтобы заменить ноль или более слэшей на 'a'. Поэтому он заменяет каждый символ "no character" на 'a'.:)

Вероятно, вы имели в виду [/]+, то есть одну или несколько косых черт.

РЕДАКТИРОВАТЬ: Прочитайте Ответ Ber для решения исходной проблемы. Я недостаточно внимательно прочитал весь вопрос.

Ответ 3

r '[/] *' означает "Совпадение 0 или более косой черты". Всего между "b" и "c" и "c" и "d" имеется ровно 0 перекосов. Следовательно, эти соответствия заменяются на "a".

Ответ 4

* соответствует его аргументу ноль или более раз и, таким образом, соответствует пустой строке. Пустая строка (логически) между любыми двумя последовательными символами. Следовательно

>>> import re
>>> re.sub(r'x*', 'a', 'bcd')
'abacada'

Что касается прямой косой черты, она не получает специального лечения:

>>> re.sub(r'/', 'a', 'b/c/d')
'bacad'

Документация описывает синтаксис регулярных выражений в Python. Как вы можете видеть, передняя косая черта не имеет специальной функции.

Причина, по которой [\w\d\s+-/*]* также находит запятую, заключается в том, что внутри квадратных скобок черточка - обозначает диапазон. В этом случае вам не нужны все символы между + и /, но буквальные символы +, - и /. Поэтому напишите тире как последний символ: [\w\d\s+/*-]*. Это должно исправить это.