2017-02-24 20 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都是要走的路。