2009-10-29 4 views
11

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

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

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

ответ

19

Посмотрите here for documentation на Python's re модуль.

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

Может быть, это намек на DOCS помощь:

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

+0

RTFM не является приемлемым ответом. Другие ответы верны. –

7

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

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

EDIT: Прочитано Ber's answer для решения исходной проблемы. Я не достаточно внимательно прочитал весь вопрос.

2

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

2

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

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

Что касается слэш, то не получает специального лечения:

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

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

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

Смежные вопросы