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

Posted

技术标签:

【中文标题】从 Python 字符串中删除零宽度空格 unicode 字符【英文标题】:Remove zero width space unicode character from Python string 【发布时间】:2018-02-19 15:04:29 【问题描述】:

我在 Python 中有一个这样的字符串:

u'\u200cHealth & Fitness'

如何删除

\u200c

字符串的一部分?

【问题讨论】:

s.encode('utf-8') @Vinny 返回字符串是\xe2\x80\x8cHealth & Fitness 我的错,编码应该是ascii Arount 在下面回答 【参考方案1】:

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

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

输出:

'Health & Fitness'

【讨论】:

这显然在上面的例子中有效,但是你强制字符串变成 ascii 丢失所有 unicode 字符,这显然不是一个适用于所有人的解决方案【参考方案2】:

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

s = "Airports Council International \u2013 North America"

那你可以试试:

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

输出将是:

Airports Council International North America

如果有帮助请点赞 :)

【讨论】:

我们不应该在编码为 ascii 后解码 'ascii' 如果您有一个字符串列表,您可以将其调整为列表理解:list_text_fixed = [(s.encode('ascii', 'ignore')).decode("utf-8") for s in list_text]【参考方案3】:

对我来说,以下工作

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

【讨论】:

您可以通过解释为什么此代码有效以及您在此处执行的操作来改进您的答案。这样,其他人就可以接受教育。 tbh,这是我之前找到但不起作用的所有答案的“弗兰肯斯坦”版本。我真的无法解释为什么在我的情况下,这个解决方案对其他解决方案都有效..【参考方案4】:

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

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

或者在你的情况下:

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

【讨论】:

这实际上比大多数字符串中接受的答案要好。 \u200c 是一个零宽度非连接符,它是strip() 忽略的不寻常的空白类型字符。在大多数使用 unicode strs 的情况下,您不想 encode(ascii, ignore) 这是通用解决方案,因为 ascii 也可能会删除一些其他 Unicode 字符。【参考方案5】:

在问题中的特定情况下:字符串以单个 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')

【讨论】:

以上是关于从 Python 字符串中删除零宽度空格 unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章

删除文档中的 U+200B 零宽度空格字符(Typora显示红点)

JavaScript 从字符串中删除零宽度空间(unicode 8203)

从列中删除逗号,空格和“NULL”字符串为0(零)

CSS Clearfix使用零宽度空格字符

默认情况下如何显示隐藏字符(零宽度空格,即&#8203)

读取文件时找不到零宽度无间隔