如何在Python中将字符串中的 \ 删除

3

我在使用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>'


相关链接:https://dev59.com/1XVD5IYBdhLWcg3wGHeu - icktoofay
那并没有真正帮助到我。我想让我的字符串只包含ASCII字符,但我不想完全剥离非ASCII字符,只是将它们转换为ASCII字面量。 - Joshua Olson
我需要ASCII,因为它极大地简化了我可以使用的正则表达式搜索字符串。我可以检查@[\w.]+\并完成它,因为我知道如果我得到']'、'>'、' '或任何类似的字符,我的域名就结束了。 - Joshua Olson
2个回答

8
你的字符串中没有反斜杠。你没有的东西,就无法删除。
考虑一下你所展示的 '\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')
これから見えるだろう

Google Translate将“Can not you see the future”翻译为英语。
在另一个答案的评论中,您说:
“我只需要ascii”

“What I'm doing with it is seeing how far apart the two strings are using nltk.edit_distance(), so this will give me a multiple of the true distance. Which is good enough for me.”
你为什么认为你需要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”——参数被称为“字符串”(不管这意味着什么),但是代码将适用于任何两个对象序列,其中!=有效。换句话说,为什么不只使用上述5个选项中的第一个?
(2)接受高达100%的编辑距离膨胀有些惊人。请注意,您当前选择的方法将每个日语字符使用4个符号(十六进制数字)。repr(x)每个字符使用8个符号。x(第一个选项)使用2个符号。
(3) 你可以通过对编辑距离进行标准化来缓解通货膨胀的影响。与将distance(s1, s2)与一个符号数量阈值进行比较不同,将distance(s1, s2) / float(max(len(s1), len(s2)))与一个分数阈值进行比较。请注意,通常情况下会使用标准化...理由是具有编辑距离为4的20个符号字符串之间的差异与具有编辑距离为2的10个符号字符串之间的差异大致相同,而不是两倍。
(4) nltk.edit_distance是我见过的最令人震惊的纯Python实现的编辑距离, Magnus Lie Hetland的这个实现要好得多,但仍有改进的空间。

是的,我在文本编辑器中查看后弄明白了。我得到的是字符的 repr 和 print 表示。谢谢。 - Joshua Olson
@Joshua Olson:我的第一版回答已经正确地回答了你的问题。你想做其他事情与是否接受我的答案无关。 - John Machin
问题是我不知道编码(垃圾邮件是字符串来源,通常格式不良好),我需要它们的某种表示形式(是的,x也是垃圾,我最终剥离了\和x,只保留字母的十六进制,您的第四个示例)以便在edit_distance中进行比较,如果我有一串十六进制数字,我可以像使用解码后的字符串一样比较它们的距离。如果您知道一种基于少量字符识别编码的方法,就像repr(x).replace('\\x', '')那样简单直接,那么我会使用它。 - Joshua Olson
我已经接受了你的答案,因为它现在涵盖了解释和我所寻找的内容。我希望有一个更好的解决方案,但是由于不知道编码,我只能用这种方式来处理。我的一些数据甚至没有域名,这会导致其他各种问题,如何处理它而不完全扰乱我的数字。 - Joshua Olson
将字符的十六进制值(减去\x)进行比较,可以得到真实编辑距离的1.0~2.0的差距,特别是当两个字符串都以这种方式转换时。是的,使用'\'而不是'\x'可能没有那么多意义,但它也不会造成太大的伤害,因为两个字符串都以相同的方式转换。 - Joshua Olson
显示剩余3条评论

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>'
>>> 

但是和上面的答案一样,你得到的基本上是没有意义的。

有时候有人想做一些我想不到的事情,但他们有很好的理由。我只是提供了一个解决方案并发出了警告… - dting
等一下。这可能是我正在寻找的确切解决方案。我知道这是无意义的,但我只需要ASCII,以便我可以以与同一字符串的另一部分(垃圾邮件消息的From和Message-ID字段)一致的方式解析它。我使用nltk.edit_distance()查看两个字符串之间的距离有多远,因此这将为我提供真实距离的倍数。这对我来说已经足够好了。 - Joshua Olson
你为什么会被“this”逗笑了呢? - John Machin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接