Как напечатать обратный слэш python
Перейти к содержимому

Как напечатать обратный слэш python

  • автор:

Обратная косая черта в регулярных выражениях

Регулярные выражения используют символ обратной косой черты ‘\’ , чтобы указать специальные формы или разрешить использование специальных символов без вызова их специального значения. Это противоречит использованию в Python одного и того же символа для той же цели в [строковых литералах][escape-sequence].

Допустим, нужно написать регулярное выражение, соответствующее строке \section , которая может быть найдена в файле LaTeX. Чтобы выяснить, что писать в программном коде, начинаем с нужной строки, которую нужно сопоставить. Затем нужно избежать появление любых обратных и других метасимволов, поставив перед ними обратную косую черту, что приведет к появлению строки \\section . Результирующая строка, которая должна быть передана в re.compile() должна быть \\section . Тем не менее, чтобы выразить это как строковый литерал в Python, оба обратных слэша должны быть снова экранированы!

  • \section — Текстовая строка для сопоставления.
  • \\section — Избежали обратной косой черты для re.compile() .
  • \\\\section — Избежали обратной косой черты для строкового литерала.

Короче говоря, чтобы сопоставить обратную косую черту литерала, нужно написать ‘\\\\’ как строку шаблона RegExp в Python, потому что регулярное выражение должно быть \\ и каждая обратная косая черта должна быть выражена как \\ внутри обычного строкового литерала Python. Регулярные выражения которые имеют несколько обратных слешей приведет к множеству повторных обратных косых черт, что затруднит понимание результирующих шаблонов.

Решение заключается в использовании необработанной строковой нотации r’RegExp’ Python для использования в регулярных выражениях. Обратная косая черта не обрабатывается каким-либо особым образом в строковом литерале с префиксом ‘r’ , так r»\n» будет представлять двухсимвольную строку, содержащую ‘\’ и ‘n’ . Регулярные выражения часто пишутся в коде Python с использованием этой необработанной строковой записи.

  • ‘ab*’ будет выглядеть как r’ab*’
  • ‘\\\\section’ будет выглядеть как r’\\section’
  • ‘\\w+\\s+\\1′ будет выглядеть как r’\w+\s+\1’
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Символьные классы и сокращенные обозначения классов
  • Повторение набора символов в регулярном выражении
  • Компиляция регулярных выражений
  • Обратный слеш в регулярных выражениях Python
  • Методы скомпилированного регулярного выражения
  • Функции уровня модуля re
  • Флаги объекта регулярного выражения
  • Метасимволы нулевой ширины в RegExp Python
  • Группы с захватом в регулярных выражениях Python
  • Обратные ссылки регулярного выражения
  • Именованные группы регулярных выражениях Python
  • Группы без захвата в регулярных выражениях
  • Опережающая и ретроспективная проверка позиции в RegExp
  • Деление строки по регулярному выражению
  • Поиск и замена по регулярному выражению
  • re.match() VS re.search()
  • Жадный квантификатор против не жадного

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

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

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

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

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

Kalashnikov ★★★
19.12.12 16:47:57 MSK

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

provaton ★★★★★
( 19.12.12 16:56:28 MSK )

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

>>> 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 ★★★
( 19.12.12 16:59:50 MSK ) автор топика
Ответ на: комментарий от Kalashnikov 19.12.12 16:59:50 MSK

Тут точно твой, строки выводятся с экранированием бекслешей. Делай 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 ★★★★★
( 19.12.12 17:04:22 MSK )
Ответ на: комментарий от provaton 19.12.12 17:04:22 MSK

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

>>> re.sub("\\", r"\textbackslash ", text) Traceback (most recent call last): File "", line 1, in 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 ★★★
( 19.12.12 17:26:25 MSK ) автор топика
Ответ на: комментарий от Kalashnikov 19.12.12 17:26:25 MSK

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

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

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

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

Как поменять бэк-слэш на слэш в Python на Windows?

У меня такая проблема:
Загружаю с Django файл на облако Selectel, а слэши автоматически меняются на бэк-слэши и файл попадает в корневую директорию, а не на определёную папку.

Например:
‘media/photo/2021/08/27/meow.jpg’
меняется на:
‘media\photo\2021\08\27\meow.jpg’

s.replace(‘\\’, ‘/’) не помог

s = os.path.join(path, filename) return os.path.join(*s.split('\\'))

тоже не помог

  • Вопрос задан более двух лет назад
  • 731 просмотр

2 комментария

Простой 2 комментария

Python. Строки. Экранированные последовательности. Неформатированные строки. Многострочные блоки текста

Строки. Экранированные последовательности. Неформатированные строки. Многострочные блоки текста

Поиск на других ресурсах:

1. Общая форма представления экранированной последовательности. Символ \ (обратный слеш)

Экранированные последовательности – это последовательности символов, определяющие специальные символы которые тяжело ввести с клавиатуры или отобразить на экране. К таким символам можно отнести, например, символ новой строки, символ звукового сигнала PC Speaker, символ клавиши BackSpace и прочее.

Для того, чтобы представить специальные символы используется символ \ . Общая форма представления экранированной последовательности следующая:

\символы

где символы – некоторые символы или цифры, заменяющие один символ. Этот символ имеет двоичное значение определяемое экранированной последовательностью.

2. Примеры вывода строк, содержащих экранированные последовательности

Экранированные последовательности влияют на вывод строк.

# Экранированные последовательности import math s = 'H\ne\nl\nl\no\nw\to\tr\tl\td\n' s2 = '\x23+\x25=\x28' print(s) print(s2)

После выполнения вышеприведенного кода будет получен следующий результат

H e l l o w o r l d 3+5=8
3. Таблица экранированных последовательностей

В таблице приведены экранированные последовательности языка Python.

Python. Экранированные последовательности. Таблица

4. Определение длины строки, содержащей экранированную последовательность

В программе экранированная последовательность может состоять из нескольких символов. При выводе на экран эти несколько символов заменяются одним соответствующим символом.

Пример.

# Экранированные последовательности - длина строки import math s = 'A\n\172' # \172 - код символа Z length = len(s) # length = 3 print(s) print('length = ',length)

В вышеприведенном коде строка

s = 'A\n\172'

в программе имеет длину 7 символов. Реальная длина строки равна 3 символам. Это объясняется тем, что строка содержит две экранированных последовательности которые заменяются одиночными символами:

  • \n – символ новой строки;
  • \172 – код символа z в восьмеричной системе исчисления.

Результат выполнения программы

A z length = 3
5. Представление символов в шестнадцатеричной и восьмеричной системах исчисления. Пример

С помощью экранированных последовательностей можно представлять символы в шестнадцатеричной и восьмеричной системах исчисления.

Пример.

# Экранированные последовательности # шестнадцатеричная система исчисления s1 = '\xF5A0' # s1 = '\xf5A0' l1 = len(s1) # l1 = 3 => # восьмеричная система исчисления s2 = '\562' # s2 = 'r' - символ в восьмеричной системе исчисления l2 = len(s2) # l2 = 1 print('s1 = ', s1) print('l1 = ', l1) print('s2 = ', s2) print('l2 = ', l2)

Результат работы программы

s1 = '\xf5A0' l1 = 3 s2 = 'r' l2 = 1
6. Представление символа обратного слеша \ . Пример

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

Пример.

# Экранированные последовательности # символ обратного слеша \ s = '\error' # s = \error s = "12\3562" # s = 12o2, \356 => o s = 'c:\\myfile.txt' # s = 'c:\myfile.txt', \\=>\ s = 'c:\myfile.txt' # s = 'c:\myfile.txt'
7. Отключение механизма экранирования. Пример

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

Например, если в некоторую переменную s нужно записать полное имя файла, который размещается по следующему маршруту

C:\1\textfile.txt

то строка на языке Python

s = 'C:\1\textfile.txt' # s = 'C: extfile.txt'

будет содержать невидимую ошибку: переменная s равна значению

C: extfile.txt

Это связано с тем, что последовательность символов \t рассматривается как один символ табуляции (см. таблицу с п. 3).

Во избежание таких негативных случаев нужно отключить (подавить) механизм экранирования. Для отключения экранированных последовательностей в строках используется следующая общая форма

r'строка_символов'
R'строка_символов'

то есть, перед строкой нужно поставить символ r или R .

Пример.

# Экранированные последовательности. Невидимые ошибки # 1. Ошибочный код s = 'C:\1\textfile.txt' # s = 'C: extfile.txt' l = len(s) # l = 15 # 2. Отключение экранированных последовательностей: r или R # Правильный код s2 = R'C:\1\textfile.txt' # s2 = 'C:\1\textfile.txt' l2 = len(s2) print(s) print('l = ', l) print(s2) print('l2 = ', l2)

Как видно из примера, в строке s формируется ошибочное полное имя файла, а в строке s2 формируется правильное имя файла благодаря символу R перед ним.

Результат выполнения программы

C: extfile.txt l = 15 C:\1\textfile.txt l2 = 17
8. Многострочные блоки текста. Пример

С помощью тройной кавычки «»»…»»» можно формировать многострочные блоки текста.

Пример.

# Экранированные последовательности # Многострочные блоки текста s = """First line, second line, third line """ s2 = """1 2 3 4""" print(s) print(s2)

Результат выполнения программы

First line, second line, third line 1 2 3 4

Связанные темы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *