Косая черта в регулярном выражении Python - PullRequest
13 голосов
/ 29 октября 2009

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

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

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

Ответы [ 4 ]

21 голосов
/ 29 октября 2009

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

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

Может быть, эта подсказка из справки по документам:

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

7 голосов
/ 29 октября 2009

Вы говорите, чтобы заменить ноль или больше слешей на 'a'. Таким образом, он заменяет каждое «без символа» на 'a'. :)

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

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

2 голосов
/ 29 октября 2009

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

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

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

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

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

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

2 голосов
/ 29 октября 2009

r '[/] *' означает «Совпадение 0 или более косых черт». Есть ровно 0 косых черт между 'b' & 'c' и между 'c' & 'd'. Следовательно, эти совпадения заменяются на «а».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...