如何在python中从字符串中移除

2024-05-16 22:53:56 发布

您现在位置: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>'


Tags: 字符串restringmyreplacex82斜杠xe7
2条回答

你的绳子上没有反斜杠。你没有的东西,你不能移除。

想想你所展示的'\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'
>>>

你“宁愿得到”的东西是没有意义的。

更新字符串的“非ascii”部分(以@>为界)实际上是以平假名编写并使用shift_jis编码的日语文本。空闲会话记录:

>>> 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')
これから見えるだろう

谷歌翻译把“你看不到未来”翻译成英文。

在对另一个答案的评论中,你说:

I just need 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的edit_distance实现。This implementation by Magnus Lie Hetland好得多,但仍有改进的能力。

我想如果你真的想把“\”去掉

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

但就像上面的答案一样,你得到的几乎毫无意义。

相关问题 更多 >