Прямая косая черта в регулярном выражении 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+/*-]*
. Это должно исправить это.