从Python字符串中删除零宽度空格Unicode字符

29

我在 Python 中有一个字符串,格式如下:

u'\u200cHealth & Fitness'
我该如何去掉

\u200c

从字符串中截取部分内容?


s.encode('utf-8') - Chen A.
@Vinny,返回的字符串是\xe2\x80\x8c健康与健身 - V.Anh
我的错,编码应该是ascii,就像Arount在下面回答的那样。 - Chen A.
5个回答

52

你可以将其编码为 ascii 并忽略错误:

u'\u200cHealth & Fitness'.encode('ascii', 'ignore')

输出:

'Health & Fitness'

9
这在上面的例子中显然是行得通的,但你强制将字符串转换为ASCII编码,导致所有Unicode字符丢失,显然这并不适用于所有情况。 - Martin Massera

32

如果你有一个包含 Unicode 字符的字符串,比如:

s = "Airports Council International \u2013 North America"

那么您可以尝试:

newString = (s.encode('ascii', 'ignore')).decode("utf-8")

输出结果将是:

北美机场协会国际

如果有帮助,点赞一下 :)


1
我们在将字符串编码为 ASCII 后,是否应该解码为 ASCII? - Vaibhav Vishal
如果您有一组字符串,可以将其转换为列表推导式:list_text_fixed = [(s.encode('ascii', 'ignore')).decode("utf-8") for s in list_text] - timothyjgraham

23

我只是使用replace,因为我不需要它:

varstring.replace('\u200c', '')

或者在您的情况下:

u'\u200cHealth & Fitness'.replace('\u200c', '')

10
在大多数字符串中,这实际上比被接受的答案更好。 \u200c 是一个零宽度的非连接符,它是一种不同寻常的类似空格的字符, strip() 会忽略它。在大多数 Unicode 字符串情况下,您不应使用 encode(ascii, ignore) - Chet
3
这是一般解决方案,因为ASCII可能会删除其他Unicode字符。 - prosti
非常感谢您的支持! - user3768258

4

对我而言,以下方法可行:

mystring.encode('ascii', 'ignore').decode('unicode_escape')

2
你可以通过解释这段代码为什么有效以及你在这里做了什么来改进你的回答。这样,其他人就可以受益于你的知识。 - RyanZim
说实话,这是我之前找到的所有答案的“弗兰肯斯坦”版本,但都没有起作用。我无法真正解释为什么在我的情况下这个方法有效。 - Diana

2
在问题的具体情况下:字符串以单个u'\200c'字符为前缀,解决方案就是简单地取一个不包括第一个字符的切片。
original = u'\u200cHealth & Fitness'
fixed = original[1:]

如果领先字符可能存在也可能不存在,可以使用str.lstrip
original = u'\u200cHealth & Fitness'
fixed = original.lstrip(u'\u200c')

相同的解决方案也适用于Python3。从Python 3.9开始,str.removeprefix也可用。
original = u'\u200cHealth & Fitness'
fixed = original.removeprefix(u'\u200c')

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