使用Python从字符串中删除非中断空格
我在Python中遇到了一个非常基本的字符串问题(我无法理解)。基本上,我正在努力做到以下几点:使用Python从字符串中删除非中断空格,python,string,unicode,text,Python,String,Unicode,Text,我在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:
'# 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
”#将文件读入字符串
myString=file.read()
“#尝试删除非中断空格
myString=myString.replace(“\u00A0”,”)
“#但是,当我将字符串打印到控制台输出时,我得到:
Foo****酒吧
我原以为“\u00A0”是unicode非中断空格的转义码,但显然我做得不正确。关于我做错了什么,你有什么想法吗?在你写的东西中没有任何迹象表明你一定做错了什么:如果原始字符串在“Foo”和“Bar”之间有一个不间断的空格,那么你现在在那里有一个正常的空格。这假设您在某个时候已经将输入字符串(我认为是bytestring,除非您使用的是Python 3或
文件
是使用编解码器
模块中的函数打开的)解码为Unicode字符串,否则您不太可能在非Unicode字节字符串中找到Unicode字符,出于的目的,请更换。但是,你写的东西中仍然没有明确的问题迹象
您能否澄清什么是输入(替换前打印repr(myString)
)和什么是输出(替换后打印repr(myString)
),以及您认为这是一个问题的原因?如果没有repr
,实际上不同的字符串可能看起来相同,但repr
在这方面很有帮助。否,u“\u00A0”
是不间断空格的转义码<代码>“\u00A0”
是6个字符,不是任何类型的转义码 您没有unicode字符串,而是一个UTF-8字节列表(Python 2.x中的字符串)
试一试
最好是切换到unicode——请参阅以获取更多想法。你可以这样说
uniString = unicode(myString, "UTF-8")
uniString = uniString.replace(u"\u00A0", " ")
它也应该可以工作(注意:我现在没有Python2.x可用),尽管在将其发送到文件或打印到屏幕时需要将其转换回字节(二进制)。请注意,一个简单的myString.strip()
不仅会删除空格,而且从myString的开始和结束都是不间断的空格。不完全是OP要求的,但在许多情况下仍然非常方便。我在为一个老问题添加另一个答案之前犹豫了一下,但是由于Python3将Unicode“非中断空格”字符计算为空白字符,并且字符串默认为Unicode,您可以使用join
和split
删除字符串s
中的非中断空格,如下所示:
s = ' '.join(s.split())
当然,这也会改变任何其他空白(制表符、换行符等)。请注意,这只是Python3。您可以通过强制编码来解决这个问题
cleaned_string = myString.encode('ascii', 'ignore')
还请注意,python的空白正则表达式字符与不间断空格匹配
以下代码将用单个空格替换一个或多个空格/非中断空格
重新导入
re.sub(r'\s+','',u“字符串,带空格和非\u00a0间断\u00a0空格”)
#'带空格和不间断空格的字符串'
您使用的是哪个版本的Python(答案可能会因您使用的是2.x还是3.x而有所不同)?嗨,Kathy,是的,我正在使用Python v2.5.1编辑我的答案作为回应。您提供的链接可能对初学者有好处,但会产生误导。它完全忽略了Unicode规范化,例如,'ć'
是u'\u0107'
,它可以表示为u'c\u0301'
您的解决方案非常有用。非常感谢。您的UTF-8解决方案正是我在日志文件中获得不间断空间所需要的。虽然当记录器将日志记录回显到控制台(不是UTF-8)时,输出看起来很奇怪,当然,它看起来很奇怪,但它在日志文件中变得完全不可见,导致它完全按照我的需要显示,在我的列标签上方有一个空行。看起来站点消失了。。我将寻找类似的替代方法。在Python 3中是否需要使用unicode()
函数或u“”?我之所以问这个问题,是因为我的理解是Python3只对unicode中的任何字符串进行编码。这个答案肯定是2.x的答案——Python3对字符串的处理方式不同。
cleaned_string = myString.encode('ascii', 'ignore')