如何在Python中从字符串中删除\xa0?

22

我有以下字符串:

 word = u'Buffalo,\xa0IL\xa060625'
我不想在那里放置 "\xa0"。如何去掉它?我想要的字符串是:
word = 'Buffalo, IL 06025

为什么需要移除它们?是否还有其他您要从字符串中删除的代码点?为什么不能将字符串编码为正确的编码并使用生成的字符串? - jamessan
现在我作为一名程序员工作了3年多,再次看到这个旧问题,我意识到这是一个相当愚蠢的问题。不过,我很惊讶这个问题居然得到了这么多的投票 :) - slopeofhope
5个回答

32
最可靠的方法是使用 unidecode 模块,自动将所有非ASCII字符转换为它们最接近的ASCII等效字符。
字符\xa0(不是您所述的\xa)是一个不间断空格,最接近的ASCII等效字符当然是普通空格。
import unidecode
word = unidecode.unidecode(word)

好的,那么如何使用“unidecode”模块进行这种转换呢? - martineau
@martineau 我的电脑上没有安装 unidecode,所以我不确定是否能给出一个具体的例子,但根据文档来看似乎很简单。既然你坚持…… - Mark Ransom
+1,因为我发现unidecode模块在解决只有部分工具支持Unicode的问题上非常有价值,尽管这就像火箭与蚊子之间的差距。 - DSM
1
@DSM 即使这个问题只涉及到非间断空格字符,我认为他们可能还有其他的 Unicode 字符,只是还没有遇到而已。任何其他的解决方案都只是在拖延难以避免的一天。 - Mark Ransom

11

如果你确定这是唯一不想要的字符,你可以使用.replace函数进行替换:

>>> word.replace(u'\xa0', ' ')
u'Buffalo, IL 60625'

如果你需要处理所有的非ascii字符,编码和替换坏字符可能是一个不错的开始...

>>> word.encode('ascii', 'replace')
'Buffalo,?IL?60625'

我不确定我对编码方法的看法。从概念上讲,这有点奇怪,因为你是从一个字符串开始将其转换为字节。 - DSM
@DSM:这有点取决于提问者为什么首先想要这样做。我能想到一些不同的原因,其中一些涉及需要ASCII字节,另一些涉及仍然需要Unicode,还有一些涉及问题本身并不是问题... - abarnert

10
您可以轻松使用unicodedata来消除所有\x...字符。
from unicodedata import normalize
normalize('NFKD', word)
>>> 'Buffalo, IL 60625'

8

这里没有 \xa。如果你尝试把它放进字符串字面值中,如果你很幸运,你会得到一个语法错误;如果你不幸,它将吞噬下一个尝试的字符,因为 \x 序列必须后跟两个十六进制数字。

你所拥有的是 \xa0,它是字符 U+00A0 的转义序列,也称为“NO-BREAK SPACE”。

我认为你想用空格替换它们,但无论你想做什么都很容易写出来:

word.replace(u'\xa0', u' ') # replaced with space
word.replace(u'\xa0', u'0') # closest to what you were literally asking for
word.replace(u'\xa0', u'')  # removed completely

3

以下方法可以用来去除非ASCII字符:

fixedword = word.encode('ascii','ignore')

1
这将删除所有空格,并使操作者得到错误的结果。 - Ned Batchelder

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