2016-08-11 9 views
0

Мне нужно найти шаблоны, которые могут иметь много метасимволов. В настоящее время я использую длинное регулярное выражение.Escape все метасимволы в Python

prodObjMatcher=re.compile(r"""^(?P<nodeName>[\w\/\:\[\]\<\>\@\$]+)""", re.S|re.M|re.I|re.X) 

(мой фактический шаблон очень долго, так что я просто вставил некоторую соответствующую часть, на которой мне нужна помощь)

Это особенно больно, когда мне нужно написать сочетания таких моделей в одной повторной компиляции.

Существует ли путинский способ сокращения длины шаблона?

+1

Зачем использовать '. *?' В конце, если он соответствует пустой строке? Кроме того, вам не нужно * всегда избегать каких-либо символов в классе символов, кроме сокращенных классов '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. Есть способы сохранить даже те (за исключением '' \ ''), не сохраненные в классе символов. –

+2

В дополнение к комментариям это пахнет работой для 'xml' ** parsing ** (имя узла ???). – Jan

+0

@ WiktorStribiżew *** мой фактический шаблон очень длинный, поэтому я просто вставил какую-то соответствующую часть, на которой мне нужна помощь ***. Было бы здорово получить ответ на то, что было задано. Я еще не специалист по регулярному выражению в python, поэтому обычно избегаю метасимволов. Вероятно, со временем научится выходить, а что нет. –

ответ

2

Посмотрите, ваша модель может быть сведена к

r"""^(?P<nodeName>[]\w/:[<>@$]+).*?""" 

Обратите внимание, что вы не должны когда-либо избежать любого не-слова символа в символьных классах, для обобщающих классов, ^, -, ] за исключением, и \. Есть способы, чтобы сохранить даже те (за \ исключение) незаменяемыми в классе символов:

  • ] в начале класса символов
  • - в начале/конце символьного класса
  • ^ - следует избегать, если вы поместите его в начале класса символов в качестве символа буква.

Вне класса символов, вы должны бежать \, [, (, ), +, $, ^, *, ?, ..

Отметьте, что / не является специальным метасимволом регулярного выражения в шаблонах регулярных выражений Python и не должен быть экранирован.

Используйте необработанные строковые литералы при определении ваших шаблонов регулярных выражений, чтобы избежать проблем (например, путаница границы слова r'\b' и обратное пространство '\b').

+1

Спасибо, что это полезная информация. –