web-dev-qa-db-ja.com

python単一の円記号を二重の円記号に置き換えます

Pythonでは、単一の円記号( "\")を二重の円記号( "\")に置き換えようとしています。私は次のコードを持っています:

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

ただし、これにより二重バックスラッシュが気に入らないというエラーメッセージが表示されます。誰でも助けることができますか?

34
Josh Wood

ここでstr.replacestring.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バージョンに\\\\が表示されます:

>>> new_strs
'C:\\\\Users\\\\Josh\\\\Desktop\\\\20130216'
46

簡単でわかりやすくします。 pythonのreモジュールを使用して、特殊文字をエスケープします。

Pythonスクリプト:

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

出力:

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

説明 :

今それを観察します 再エスケープ 与えられた文字列の特殊文字をエスケープする機能。各バックスラッシュの前に別のバックスラッシュを追加でき、最終的に出力は目的の出力である二重バックスラッシュになります。

これがお役に立てば幸いです。

12
Rewanth Cool

エスケープ文字を使用:"full\\path\\here""\\"および"\\\\"

8
alexpinho98

In python _\_(バックスラッシュ)はエスケープ文字として使用されます。これは、特殊文字(改行など)を挿入する場所では、バックスラッシュと別の文字(改行は_\n_)

刺し傷の例では、_"C:\Users\Josh\Desktop\20130216"_をreplに入れると、_"C:\\Users\\Josh\\Desktop\x8130216"_になります。これは、_\2_がpython sting。で特別な意味を持つためです。_\_を指定したい場合は、文字列に_\\_を2つ入れる必要があります。

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

もう1つのオプションは、スティングの前にrを追加することで、スティング全体がエスケープ文字として_\_を使用してはならないことをpythonに通知することです。

_r"C:\Users\Josh\Desktop\20130216"_

これは「生の」文字列であり、正規表現のスティングなど、多くのバックスラッシュを使用する必要がある状況で非常に役立ちます。

それでもその単一の_\_を_\\_に置き換えたい場合は、以下を使用します。

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

通知上記の最後の2つのスティングで_r'_を使用していないことに注意してください。これは、スティングの_r'_形式を使用する場合、そのストリングを単一の_\_で終了できないためです。

なぜPythonの生の文字列リテラルが単一のバックスラッシュで終わらないのですか?

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

3
RFV5s

ソース文字列を指定すると、 os.path を使用した操作の方が理にかなっているかもしれませんが、文字列の解決策は次のとおりです。

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

split\\は、区切り文字で区切られた空の文字列としてのソース文字列です。 filterを使用すると、これらの空の文字列が削除されるため、joinはすでに二重化されたバックスラッシュを2倍にしません。残念ながら、3つ以上ある場合、バックスラッシュは2倍に減りますが、Windowsのパス式であなたを傷つけることはないと思います。

0
CAB

バックスラッシュは、特別なエスケープ文字を示します。したがって、directory = path_to_directory.replace("\", "\\")はPythonを置き換え、最初の引数がエスケープとして終了引用を理解したため、2番目の引数の開始引用まで終了しなかったと考えます。キャラクター。

directory=path_to_directory.replace("\\","\\\\")
0
abacles

使用できます

os.path.abspath(path_with_backlash)

\でパスを返します

0
AHRG

あなたの場合は構文エラーかもしれませんが、行を次のように変更できます:

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

次の出力が得られます。

C:\\Users\\Josh\\Desktop\\20130216
0
A STEFANI