python замінити одиничний зворотний двійчастий слід з подвійним зворотним слеш

У python я намагаюся замінити одну зворотну косу риску ("\") з подвійною зворотною косою риси ("\"). У мене є такий код:

directory = string.replace("C:\Users\Josh\Desktop\20130216", "\", "\\")

Проте це дає повідомлення про помилку, в якому йдеться, що йому подобається подвійна зворотна коса риска. Чи може хто-небудь допомогти?

26
Це також не схожий на одну зворотну косу риску
додано Автор Ryan Haining, джерело
Backspace - рядок . Ви самі не можете використовувати його.
додано Автор Santa, джерело
Я не розумію сенсу цього питання. Також чому основне нерозуміння евакуаційних персонажів заслуговує на 50-ти крапку щедрості?
додано Автор Tim Seguine, джерело
Ви можете піти з використанням прямих косих слів; може бути легше для вас.
додано Автор squiguy, джерело
просто намагаюся отримати більше/кращих пропозицій, оскільки вони не вирішують мою проблему. Фігурна вона варто спробувати, щоб уникнути запиту абсолютно нового запитання.
додано Автор Demis, джерело

8 Відповіді

Не потрібно використовувати тут код str.replace або string.replace , просто перетворіть цей рядок в необроблену рядок:

>>> strs = r"C:\Users\Josh\Desktop\20130216"
           ^
           |
       notice the 'r'

Нижче наведено версію repr наведеної вище рядка, тому ви бачите \\ тут. Але, насправді, фактичний рядок містить лише '\' , а не \\ .

>>> strs
'C:\\Users\\Josh\\Desktop\\20130216'

>>> s = r"f\o"
>>> s            #repr representation
'f\\o'
>>> len(s)   #length is 3, as there's only one `'\'`
3

Але коли ви збираєтеся роздрукувати цю строку, ви не отримаєте '\\' у вихідному файлі.

>>> print strs
C:\Users\Josh\Desktop\20130216

Якщо ви хочете, щоб рядок відображався '\\' під час print , використовуйте str.replace :

>>> new_strs = strs.replace('\\','\\\\')
>>> print new_strs
C:\\Users\\Josh\\Desktop\\20130216

repr version will now show \\\\:

>>> new_strs
'C:\\\\Users\\\\Josh\\\\Desktop\\\\20130216'
34
додано
@Demis Ви можете навести приклад?
додано Автор Ashwini Chaudhary, джерело
Як ви переконаєтесь, що існуючий "\\" не подвоюється? Напр. ви хочете мати максимум подвійної зворотної риски (у версії print )?
додано Автор Demis, джерело
У мене є скрипт, в якому мені потрібно зберегти файловий шлях, щоб містити подвійний файл \\ (для відправлення до програми, яка потребує цього виходу), але шлях вхідного файлу іноді вже містить це (надано користувачем/Python script), а іноді не (містить тільки одиничні - \ 's). Я хочу очистити введення, щоб переконатись, що всі \ 's перетворені точно \\. Напр. Користувач може надати \\, якщо вони знають синтаксис програми \\, але якщо вони не будуть, вони не нададуть одиночну \ '. Я міг вимагати всього лише одного - \ 's весь час, але думав, що це може бути не надто складно, щоб дезинфікувати це правильно в будь-якому випадку.
додано Автор Demis, джерело
Це чудова пропозиція, спасибі!
додано Автор Demis, джерело
@Demis: Подивіться на os.path.normpath (шлях) . Це видаляє всі повторювані зворотні смуги рисунка. Після цього замінити єдиний зворотний косу риску з подвійним зворотним слеш.
додано Автор Cerno, джерело

Дозвольте мені зробити це простим та зрозумілим. Давайте використовувати re модуль у python, щоб уникнути спеціальних символів.

Сценарій Python:

import re
s = "C:\Users\Josh\Desktop"
print s
print re.escape(s)

Вихід:

C:\Users\Josh\Desktop
C:\\Users\\Josh\\Desktop

Пояснення:

Тепер зауважте, що функція re.escape на виході зі спеціальних символів у заданій рядку дозволяє додавати інший зворотний скріс до кожної зворотної смуги риски, і, нарешті, результат дає подвійне зворотне злягання, потрібний результат.

Сподіваюсь, це допоможе вам.

9
додано
Будь ласка, надайте певний контекст та пояснення для коду. Також перевірте форматування вашого коду.
додано Автор James K, джерело
Це чудово, що є функція зробити це для вас! Це саме те, що мені було потрібно, і це набагато краще, ніж чотиризначні зворотні схили. Просто і ясно, дійсно.
додано Автор Demis, джерело
re.escape також втече. так що друк (re.escape ('bob.txt') виводить 'bob \ .txt' Escape призначений для виходу з довільних рядків, які будуть використовуватися в регулярних виразах, і не призначені для виходу з шляхів файлів.
додано Автор Brian C., джерело
@JamesK Вибачте за пояснення. Дайте мені це виправити.
додано Автор Rewanth Cool, джерело
нарешті, також спадає пробіли "\ \ \"
додано Автор Kjeld Flarup, джерело

Use escape characters: "full\\path\\here", "\\" and "\\\\"

8
додано
r '\' невірно, це призведе до виникнення помилки EOF , оскільки ви фактично виключите остаточну цитату.
додано Автор Ashwini Chaudhary, джерело
Те, як Python аналізується лексично, r "\" або r "\\" не буде працювати, як ви очікуєте.
додано Автор Santa, джерело
змінив його зараз.
додано Автор alexpinho98, джерело

У python \ (зворотна риска) використовується як символ виходу. Що це означає, що в тих місцях, де ви хочете вставити спеціальний символ (наприклад, новий рядок), ви використовуватимете зворотну риску і інший символ ( \ n для нового рядка)

З наочним прикладом ви можете помітити, що, коли ви вставите "C: \ Users \ Josh \ Desktop \ 20130216" у відповідь, ви отримаєте "C: \\ Users \\ Josh \\ Desktop \ x8130216 ". Це тому, що \ 2 має особливе значення в жанрі python. Якщо ви хочете вказати \ , то вам потрібно додати два \\ у ваш рядок.

"C: \\ Users \\ Josh \\ Desktop \\ 28130216"

The other option is to notify python that your entire sting must NOT use \ as an escape character by pre-pending the sting with r

r "C: \ Users \ Josh \ Desktop \ 20130216"

Це "сирий" рядок, і дуже корисний у ситуаціях, коли вам потрібно використовувати багато зворотних слів, наприклад, з викликами регулярного виразу.

Якщо ви все ще хочете замінити цей унікальний код \ з \\ , ви б використали:

directory = string.replace (r "C: \ Users \ Josh \ Desktop \ 20130216", "\\", "\\\\")

Notice that I am not using r' in the last two stings above. This is because, when you use the r' form of stings you cannot end that string with a single \

Why can't Python's raw string literals end with a single backslash?

https://pythonconquerstheuniverse.wordpress.com/2008/06/04/gotcha-%E2%80%94-backslashes-are-escape-characters/

2
додано

Використання:

string.replace(r"C:\Users\Josh\Desktop\20130216", "\\", "\\")

Уникайте символу \ .

2
додано
Я думаю, ви маєте на увазі, що останній має бути r '\\' або '\\\\'
додано Автор Ryan Haining, джерело
Яка точка використання сирої рядка, а потім застосувати цю заміну.
додано Автор Ashwini Chaudhary, джерело
Я вірю в те, як аналізується Python, r '\\' не працює так, як ви очікували.
додано Автор Santa, джерело
Ваш останній аргумент повинен бути, "\\\\" .
додано Автор Santa, джерело

Можливо синтаксична помилка у вашому випадку ви можете змінити лінію на:

directory = str(r"C:\Users\Josh\Desktop\20130216").replace('\\','\\\\')

які дають вам право наступного виходу:

C:\\Users\\Josh\\Desktop\\20130216
0
додано

Зворотна коса риска означає спеціальний символ виходу. Тому directory = path_to_directory.replace ("\", "\\") може змусити Python думати, що перший аргумент замінити не закінчився до початкової котирування другого аргументу, оскільки він зрозумів кінцева цитата як символ виходу.

directory=path_to_directory.replace("\\","\\\\")
0
додано

З огляду на вихідний рядок, маніпулювання os.path може мати більше сенсу, але ось струнне рішення;

>>> s=r"C:\Users\Josh\Desktop\\20130216"
>>> '\\\\'.join(filter(bool, s.split('\\')))
'C:\\\\Users\\\\Josh\\\\Desktop\\\\20130216'

Зауважте, що split розглядає < code> \\ у вихідному рядку як розмежовану порожню рядок. Використання фільтра позбавляє цих порожніх рядків, тому join не подвоїть вже подвоїти зворотні смуги. На жаль, якщо у вас є 3 або більше, вони скорочуються до подвійних зворотних слів, але я не думаю, що це буде болем у виразі шляху до Windows.

0
додано
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;