更换'\x、 .';Python中的literal字符串
我的目录包含“\x…”字符,如“\x00”:更换'\x、 .';Python中的literal字符串,python,linux,Python,Linux,我的目录包含“\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',
#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替换这些字符
编辑:
为了理解字符,当我将ls
传输到xxd
时,ascii表示中将出现“\”字符。十六进制表示“5c”这对我来说很有用:
dir = r'foo\x00bar'
print dir
dir.replace(r'\x00', '')
print dir
输出为:
foo\x00bar
foobar
foo\x1Dbar
foobar
string.replace(s,old,new[,maxreplace])
返回字符串s的副本,其中所有出现的子字符串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\x00bar
foobar
foo\x1Dbar
foobar
这对我很有用:
dir = r'foo\x00bar'
print dir
dir.replace(r'\x00', '')
print dir
输出为:
foo\x00bar
foobar
foo\x1Dbar
foobar
string.replace(s,old,new[,maxreplace])
返回字符串s的副本,其中所有出现的子字符串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\x00bar
foobar
foo\x1Dbar
foobar
这个解释器会话应该显示dirname中有一个实际的空字符,与后面有一个
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'
在任何一种情况下,字符串.replace都是正确的选择。这个解释器会话应该显示dirname中有一个实际的空字符,与后面有一个
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
是一种方法。我首先在python中执行一个os.listdir()
,并验证python认为这些目录名的字符串表示形式是什么样的。可以像new_dir\u name=dir.replace('\0','')一样简单。
os.listdir(dir path)给出'c\\x00mb'。让我试试dir.replace,它似乎暗示您的目录名中有一个反斜杠。如果它有一个实际的空字符,它看起来像c\x00mb
。通过hextump
管道输出ls
,以确认文件名中真正包含哪些字符。我首先执行os.listdir()
在python中,并验证python认为这些目录名的字符串表示形式是什么样子。可以像new\u dir\u name=dir.replace('\0','')一样简单。
os.listdir(dir\u path)给出'c\\x00mb'。让我试试dir.replace,它似乎暗示您的目录名中有一个反斜杠。如果它有和实际的空字符,它看起来像c\x00mb
。通过hextump
管道将ls
的输出传输到hextump
,以确认文件名中确实有哪些字符。您可能想解释为什么正则表达式失败,\x00可以工作,但可以扩展为正则表达式以考虑其他字符吗(例如使用\x0A、\x0D…)谢谢@Jean-Françoisfare。答案用正则表达式解决方案/解释更新您可能想解释为什么正则表达式失败,\x00可以工作,但可以扩展为正则表达式以考虑其他问题(例如使用\x0A、\x0D…)谢谢@Jean-Françoisfare。答案用正则表达式解决方案/解释更新