linux 替换Python中的“\x..”文本字符串

rks48beu  于 2023-03-17  发布在  Linux
关注(0)|答案(3)|浏览(139)

我的目录包含“\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”

mepcadol

mepcadol1#

string.replace对我很有效:

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

输出为:

foo\x00bar
foobar

一月一日

返回字符串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\x1Dbar
foobar
8zzbczxx

8zzbczxx2#

这个解释器会话应该显示目录名中实际包含一个空字符与包含一个backlash后跟一个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都是可行之道。

oprakyz7

oprakyz73#

\x表示十六进制字符转义。
tavnab提供的答案对我不起作用。
原因是string.replace不是一个inplace方法,而且,在Python 3中,print函数需要括号,所以,更新后的答案应该是:

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

其然后实际上产生以下输出:

foo\x00bar
foobar

相关问题