[python]: проблема с строковыми литералами python - PullRequest
3 голосов
/ 16 августа 2011

код идет ниже:

line = r'abc\def\n'
rline = re.sub('\\\\', '+', line) # then rline should be r'abc+def+n'

Видимо, я просто хочу заменить обратную косую черту в строке с '+'.Я думал, что обратная косая черта в строке может быть выражена как «\», тогда почему я должен использовать «\\» для правильной работы re.sub.

Я в замешательстве.

Ответы [ 3 ]

7 голосов
/ 16 августа 2011

Хорошая привычка - всегда использовать необработанные строки при работе с шаблонами регулярных выражений:

In [45]: re.sub(r'\\', r'+', line)
Out[45]: 'abc+def+n'

Чтобы ответить на ваш вопрос, Python интерпретирует '\\\\' как два символа обратной косой черты:

In [44]: list('\\\\')
Out[44]: ['\\', '\\']

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

4 голосов
/ 16 августа 2011

Поскольку существует два уровня обратной косой черты:

  1. re.sub использует \ как escape
  2. Python использует \ как escape (если вы не делаете r '...')

Итак \\\\ (python) -> \\ (re.sub) -> \

РЕДАКТИРОВАТЬ

И уровень SObackslashing!(это меня достало!)

2 голосов
/ 16 августа 2011

Если вы хотите искать буквальный шаблон, а не фактическое регулярное выражение, вы должны использовать как необработанные строки, так и re.escape(), чтобы избежать удвоения обратной косой черты или любого другого ручного экранирования полностью.

Итак, ваш пример будет:

line = r'abc\def\n'
backslash = re.escape(r'\')
rline = re.sub(backslash, '+', line)
...