使用 Python 从字符串中删除不间断空格

Posted

技术标签:

【中文标题】使用 Python 从字符串中删除不间断空格【英文标题】:Removing non-breaking spaces from strings using Python 【发布时间】:2011-02-05 09:25:39 【问题描述】:

我在 Python 中遇到了一个非常基本的字符串问题(我无法弄清楚)。基本上,我正在尝试执行以下操作:

'# read file into a string 
myString =  file.read()

'# Attempt to remove non breaking spaces 
myString = myString.replace("\u00A0"," ")

'# however, when I print my string to output to console, I get: 
Foo **<C2><A0>** Bar

我认为“\u00A0”是 unicode 非中断空格的转义码,但显然我没有正确执行此操作。关于我做错了什么有什么想法吗?

【问题讨论】:

您使用的是哪个版本的 Python(根据您使用的是 2.x 还是 3.x,答案可能会有所不同)? 嗨凯西,是的,我正在使用 Python v2.5.1 编辑了我的回答作为回应。 【参考方案1】:

在你写的内容中没有任何迹象表明你一定做错了什么:如果原始字符串在 'Foo' 和 'Bar' 之间有一个不间断的空格,那么你现在有一个正常的空格。这假设在某些时候您已经将输入字符串(我想它是一个字节字符串,除非您使用 Python 3 或使用 codecs 模块中的函数打开 file)解码为 Unicode 字符串,否则出于replace 的目的,您不太可能在非 unicode 字节字符串中找到 unicode 字符。但是,您所写的内容并没有明显的问题迹象。

您能否澄清一下输入是什么(在替换之前打印repr(myString))和输出是什么(在替换之后再次打印repr(myString))以及为什么您认为这是个问题?如果没有 repr,实际上不同的字符串可能看起来相同,但 repr 会有所帮助。

【讨论】:

【参考方案2】:

不,u"\u00A0" 是不间断空格的转义码。 "\u00A0" 是 6 个字符,不是任何类型的转义码。 Read this.

【讨论】:

您提供的链接可能对初学者有好处,但它具有误导性。它完全忽略了 Unicode 规范化,例如,'ć'u'\u0107',它可以表示为 u'c\u0301' unicode.org/reports/tr15【参考方案3】:

您没有 unicode 字符串,而是 UTF-8 字节列表(这是 Python 2.x 中的字符串)。

试试

myString = myString.replace("\xc2\xa0", " ")

改用 unicode 会更好——请参阅this article 了解想法。因此你可以说

uniString = unicode(myString, "UTF-8")
uniString = uniString.replace(u"\u00A0", " ")

它也应该可以工作(警告:我现在没有可用的 Python 2.x),尽管在将其发送到文件或将其打印到屏幕时需要将其转换回字节(二进制) .

【讨论】:

您的解决方案很有帮助。谢谢! 您的 UTF-8 解决方案正是我在日志文件中获取不间断空间所需要的。虽然当记录器将日志记录回显到控制台时输出看起来很奇怪,这不是 UTF-8,当然,它看起来很奇怪,但它在日志文件中变得完全不可见,导致它完全按照我的需要出现,我的列标签上方有一个空行。 看起来该网站消失了。我会寻找另一个类似的。 在 Python 3 中是否需要使用 unicode() 函数或 u""?我之所以问这个问题是因为我的理解是 Python 3 仅在 unicode 中编码每个字符串。 这个答案绝对是 2.x 的答案——Python 3 对字符串的处理方式不同。【参考方案4】:

请注意,简单的myString.strip() 不仅会删除空格,还会删除 myString 开头和结尾的非中断空格。不完全符合 OP 的要求,但在许多情况下仍然非常方便。

【讨论】:

【参考方案5】:

在为一个老问题添加另一个答案之前我犹豫了,但是由于 Python3 将 Unicode“不间断空格”字符计为空白字符,并且由于字符串默认为 Unicode,因此您可以在使用joinsplit 的字符串s,如下所示:

s = ' '.join(s.split())

当然,这也会更改任何其他空白(制表符、换行符等)。请注意,这仅适用于 Python3。

【讨论】:

【参考方案6】:

你可以通过强制编码来解决这个问题。

 cleaned_string = myString.encode('ascii', 'ignore')

【讨论】:

【参考方案7】:

另请注意,python 的空白正则表达式字符匹配不间断空格。

以下代码将用一个空格替换一个或多个空格/不间断空格

import re

re.sub(r'\s+', ' ', u"String with    spaces and non\u00A0breaking\u00A0spaces")
# 'String with spaces and non breaking spaces'

【讨论】:

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

如何在 JSF 页面中插入不间断空格字符?

ReactJS 使用不间断空格渲染字符串

MySQL全文搜索、整理和不间断空格

根据十六进制值从字符串中删除特定字符

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

显示带有不间断空格和多行的 NSAttributedString 的 Swift 错误