2017-02-24 54 views
0

我有目錄,包含 '\ X ..' 字符,如 '\ X00':更換 ' X ..' litteral字符串在Python

#ls 
c\x00mb 

,我想他們沒有這些重命名,因爲當我將這些文件複製到窗口時,它們變得無法使用。 所以我的Python腳本正在經歷這些目錄和檢測存在問題的字符的方式如下:

if '\\x' in dir: # dir is the name of the current directory 

首先,我想我可以使用Python中的re模塊擺脫這個問題的:

new_dir_name = re.sub('\x00', r'', dir) # I am using \x00 as an example 

但這沒有奏效。有沒有辦法可以用python替換字符?

編輯: 爲了解字符,當我管lsxxd'\'字符出現在ascii表示中。在十六進制它顯示 '5C'

+0

我會先在python中做一個'os.listdir()',並驗證python認爲這些目錄名稱的字符串表示是什麼樣的。 – turbulencetoo

+1

可以像'new_dir_name = dir.replace'('\ 0','')一樣簡單' – turbulencetoo

+0

os.listdir(dir_path)給出'c \\ x00mb'。讓我試試dir.replace – aze

回答

2

string.replace爲我工作:

dir = r'foo\x00bar' 
print dir 
dir.replace(r'\x00', '') 
print dir 

輸出是:

foo\x00bar 
foobar 

string.replace(s, old, new[, maxreplace])

返回字符串s的一份副本所有出現的舊字符串被新字符替換。如果給出可選參數maxreplace,則會替換第一個maxreplace事件。

正則表達式還可以工作在一般的情況下,但你必須轉義反斜線,這樣\x本身不被解釋爲一個正則表達式逃逸。

對於後跟兩個十六進制數字去除\x一般情況下:

import re 
dir = r'foo\x1Dbar' 
print dir 
re.sub(r'\\x[0-9A-F]{2}', '', dir) 
print dir 

輸出是:

foo\x1Dbar 
foobar 
+0

你可能想解釋爲什麼正則表達式失敗, –

+0

\ x00的作品,但可以擴展爲正則表達式來考慮其他人(例如\ x0A,\ x0D ...) – aze

+0

謝謝@ Jean-FrançoisFabre。回答更新與正則表達式解決方案/說明 – tavnab

2

這個解釋器會話應該顯示您的目錄名之間的差別在實際的空字符它相對於後面跟着x後面跟着兩個0 s。

>>> bad_dir_name = "c\x00mb" 
>>> bad_dir_name 
'c\x00mb' 
>>> good_dir_name = bad_dir_name.replace("\x00", "") 
>>> good_dir_name 
'cmb' 
>>> 
>>> bad_dir_name2 = "c\\x00mb" 
>>> bad_dir_name2 
'c\\x00mb' 
>>> good_dir_name2 = bad_dir_name2.replace("\\", "") # remove the backslash 
>>> good_dir_name2 
'cx00mb' 

無論哪種情況,string.replace都是要走的路。