экранирование символов в регулярном выражении - PullRequest
1 голос
/ 09 августа 2010

Регулярное выражение ниже:

 [a-z]+[\\.\\?]

Почему \\ используется косая черта дважды, а не один раз?

Ответы [ 3 ]

3 голосов
/ 09 августа 2010

Регулярное выражение ниже:

 [a-z]+[\\.\\?]

... это не регулярное выражение, а строка (которая может быть шаблоном для регулярного выражения; вы можете построить REнапример, передавая re.compile).

Почему \\ косая черта используется дважды вместо одного?

Возможно, вы неправильно понимаете, что происходитon ...:

>>> s = '[a-z]+[\\.\\?]'
>>> s
'[a-z]+[\\.\\?]'
>>> print(s)
[a-z]+[\.\?]

Вы вводите \ дважды в каждом случае, чтобы первый "уклонился" от второго, то есть остановил его отформирование "escape-последовательности" со следующим следующим символом.Вы видите дважды, когда смотрите на строку repr (это то, что показывает вам интерактивная оболочка Python, когда вы просто вводите в ее подсказке имя, к которому относится объект строки).Но вы видите это только один раз, когда вы просто смотрите на строку, например, с print - сама строка не имеет дубликатов, вы, вероятно, просто смущены «вводом дважды» и «отображением дважды» (в repr) функций.

Другой удобный способ ввода точно такого же строкового значения, также как и литерала:

>>> z = r'[a-z]+[\.\?]'
>>> z
'[a-z]+[\\.\\?]'
>>> print(z)
[a-z]+[\.\?]
>>> z == s
True

Префикс r (для «raw literal») означает, чтони одна из следующих обратных косых черт не считается частью escape-последовательности - каждая из них стоит сама за себя, поэтому дублирование не требуется.

Обратите внимание, что z ведет себя точно так же, как s и действительно равно ему:ведущий r делает , а не создает «строки другого типа», просто предлагает удобный способ ввода строк с множеством обратных косых черт, не удваивая их (это предназначено для облегчения ввода буквенных строк, обозначаемых какшаблоны регулярных выражений; r альтернативно может восприниматься как «шаблон регулярных выражений»: -).

2 голосов
/ 09 августа 2010

И ., и ? экранируются.

Однако с классом символов регулярного выражения (в пределах []) это не требуется.Это будет работать так же:

[a-z]+[.?]

Редактировать : с вашим редактированием, спрашивая о \\, это зависит.Это регулярное выражение в строке внутри ""?В зависимости от языка иногда необходимо экранировать \ в дополнительное время в двойных кавычках.Но внутри '' это может не понадобиться.Откуда ты это взял?

0 голосов
/ 09 августа 2010

Первый выходит за пределы периода.Второй экранирует знак вопроса.

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