如何在Python字符串中去除\字符
我在使用replace()的时候遇到了问题。
我试过 my_string.replace('\\', '')
和 re.sub('\\', '', my_string)
,但是都没有成功。
我以为反斜杠(\)是用来表示反斜杠的转义符,难道我错了吗?
我想处理的字符串是这样的:
'<2011315123.04C6DACE618A7C2763810@\x82\xb1\x82\xea\x82\xa9\x82\xe7\x8c\xa9\x82\xa6\x82\xe9\x82\xbe\x82\xeb\x82\xa4>'
或者用 print my_string
打印出来是:
<2011315123.04C6DACE618A7C2763810@???ꂩ?猩???邾?낤>
没错,它看起来像一堆乱码,但我希望能得到:
'<2011315123.04C6DACE618A7C2763810@82b182ea82a982e78ca982a682e982be82eb82a4>'
2 个回答
我觉得这样做可以,如果你只是想去掉“\”这个符号。
>>> a = '<2011315123.04C6DACE618A7C2763810@\x82\xb1\x82\xea\x82\xa9\x82\xe7\x8c\xa9\x82\xa6\x82\xe9\x82\xbe\x82\xeb\x82\xa4>'
>>> repr(a).replace("\\","")[1:-1]
'<2011315123.04C6DACE618A7C2763810@x82xb1x82xeax82xa9x82xe7x8cxa9x82xa6x82xe9x82xbex82xebx82xa4>'
>>>
不过,就像上面的回答说的,你得到的结果其实没什么意义。
你的字符串里没有反斜杠。没有的东西是无法去掉的。
你所展示的 '\x82'
其实是一个字节的字符串。
>>> s = '\x82'
>>> len(s)
1
>>> ord(s)
130
>>> hex(ord(s))
'0x82'
>>> print s
é # my sys.stdout.encoding is 'cp850'
>>> print repr(s)
'\x82'
>>>
你想要的 'x82'
是没有意义的。
更新 字符串中“非ASCII”的部分(由 @
和 >
限定)实际上是用平假名写的日文,编码方式是 shift_jis
。这是 IDLE 会话的记录:
>>> y = '\x82\xb1\x82\xea\x82\xa9\x82\xe7\x8c\xa9\x82\xa6\x82\xe9\x82\xbe\x82\xeb\x82\xa4'
>>> print y.decode('shift_jis')
これから見えるだろう
谷歌翻译把它翻译成了“你看不到未来”。
在另一条回答的评论中,你说:
我只需要 ASCII。
还有:
我用它来看看这两个字符串之间的差距,使用的是 nltk.edit_distance(),这样可以 得到一个真实距离的倍数。对我来说这就足够了。
你为什么觉得需要 ASCII 呢?编辑距离的定义和任何字母表是无关的。
首先,对字符串进行无意义的转换不会给你一个一致或可预测的真实距离倍数。其次,在以下选项中:
x
repr(x)
repr(x).replace('\\', '')
repr(x).replace('\\x', '') # if \ is noise, so is x
x.decode(whatever_the_encoding_is)
你为什么选择第三个?
更新 2 针对评论的回应:
(1) 你仍然没有说明为什么觉得需要“ASCII”。nltk.edit_distance 不需要“ASCII”——参数被称为“字符串”(这是什么意思呢),但代码可以处理任何两个可以用 !=
比较的对象序列。换句话说,为什么不直接使用上面五个选项中的第一个呢?
(2) 接受编辑距离高达 100% 的膨胀是有点惊人的。注意你目前选择的方法每个日文字符会使用 4 个符号(十六进制数字)。repr(x)
每个字符使用 8 个符号。x
(第一个选项)使用 2 个。
(3) 你可以通过标准化编辑距离来减轻膨胀的影响。与其用符号数量的阈值比较 distance(s1, s2)
,不如用 distance(s1, s2) / float(max(len(s1), len(s2)))
与一个分数阈值比较。注意,标准化通常是有用的……其理由是,20个符号的字符串编辑距离为4的相似度大致与10个符号的字符串编辑距离为2的相似度相同,而不是两倍。
(4) nltk.edit_distance 是我见过的最低效的纯 Python 实现的编辑距离。Magnus Lie Hetland 的这个实现 要好得多,但仍然可以改进。