我的目录包含'\ x ..'字符,例如'\ x00':
#ls
c\x00mb
并且我想在没有这些的情况下重命名它们,因为当我将这些文件复制到Windows时它们变得无法使用。 所以我的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替换这些字符?
编辑:
为了理解char,当我将ls
传递给xxd
时,'\'字符出现在ascii表示中。在十六进制中,它显示'5c'
答案 0 :(得分: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的副本,其中所有出现的substring old都替换为new。如果给出了可选参数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
答案 1 :(得分:2)
这个解释器会话应该显示你的dirname中有一个实际的空字符,而后面跟一个x
后跟两个0
的差异。
>>> 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
都是可行的方法。