使用 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,因此您可以在使用join
和split
的字符串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 从字符串中删除不间断空格的主要内容,如果未能解决你的问题,请参考以下文章