LINUX.ORG.RU

Обратный слеш в сырых строках

 , ,


0

1
>>> print "\"
SyntaxError: EOL while scanning string literal
>>> print r"\"
SyntaxError: EOL while scanning string literal
>>> print "\\"
\
>>> print r"\\"
\\

Почему во втором случае кавычка экранируется? И как тогда написать raw строку из одной черты, лол?

В общем-то в доках прямо так и написано:

... r"\" is not a valid string literal...

Но мне так и не понятно, почему?

Ну без этого нельзя было бы в рав-строку включить кавычку.

provaton ★★★★★ ()

Ещё какой-то тупак (мой?):

>>> re.sub(r"(wtf)", r"\\1", "wtf")
'\\1'
>>> re.sub(r"(wtf)", r"\\\1", "wtf")
'\\wtf'

>>> re.sub(r"(wtf)", "\\1", "wtf")
'wtf'
>>> re.sub(r"(wtf)", "\\\1", "wtf")
'\\\x01'
Мне вообще, «\wtf» надо, эээа...

Kalashnikov ★★★ ()
Ответ на: комментарий от Kalashnikov

Ещё какой-то тупак (мой?):

Тут точно твой, строки выводятся с экранированием бекслешей. Делай print.

In [11]: print(re.sub(r"(wtf)", r"\\\1", "wtf"))
\wtf
In [12]: len(re.sub(r"(wtf)", r"\\\1", "wtf"))
Out[12]: 4

provaton ★★★★★ ()
Ответ на: комментарий от provaton

А, тьфу, но почему тогда работает с тремя слешами а не с двумя? Один для \1, второй идёт прямиком в строку, зачем третий?

И на последок:

>>> re.sub("\\", r"\textbackslash ", text)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/re.py", line 151, in sub
    return _compile(pattern, flags).sub(repl, string, count)
  File "/usr/lib/python2.7/re.py", line 242, in _compile
    raise error, v # invalid expression
sre_constants.error: bogus escape (end of line)
А падает просто от того что регэксп заканчивается на слеш.

Kalashnikov ★★★ ()
Ответ на: комментарий от Kalashnikov

А, тьфу, но почему тогда работает с тремя слешами а не с двумя?

Просто дело в том, что регекспы - это сам по себе язык программирования. Поэтому, у тебя идет два этапа экранирования - питоновское экранирование, и экранирование самого движка регекспов. То есть, питон в литерале r'\\\1' делает три бекслеша, а уже движок регекспов из первых двух бекслешей делает один, а из \1 делает подстановку группы. Просто надо всегда разделять эти два этапа, тогда все станет понятно.

А падает просто от того что регэксп заканчивается на слеш.

Да, регексп не может заканчиваться на слеш, и эту ошибку как раз выдает движок регулярок. Для питона «\\» - это обычный литерал.

provaton ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.