更换'\x、 .';Python中的literal字符串

更换'\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',

我的目录包含“\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替换这些字符

编辑: 为了理解字符,当我将
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。答案用正则表达式解决方案/解释更新