Python - 替换字符串中的非ASCII字符 (»)

16

我需要将字符串中的字符 "»" 替换为一个空格,但是我仍然遇到错误。这是我使用的代码:

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup

# other code

soup = BeautifulSoup(data, 'lxml')
mystring = soup.find('a').text.replace(' »','')

UnicodeEncodeError: 'ascii' 编解码器无法在位置13处编码字符u'\xbb',因为该字符不在128的范围内

但是,如果我使用另一个脚本进行测试:

# -*- coding: utf-8 -*-
a = "hi »"
b = a.replace('»','') 

它有效。为什么是这样?


1
直接将你得到的错误信息谷歌搜索,我得到了以下反馈:https://dev59.com/V2435IYBdhLWcg3w6EmF 那里应该有你可以使用的信息。 - Ma0
2个回答

22

使用str.replace()方法替换字符串的内容,需要先对字符串进行解码,然后替换文本并将其重新编码回原始文本:

>>> a = "hi »"
>>> a.decode('utf-8').replace("»".decode('utf-8'), "").encode('utf-8')
'hi '
您还可以使用以下正则表达式从字符串中删除所有非ASCII字符:
>>> import re
>>> re.sub(r'[^\x00-\x7f]',r'', 'hi »')
'hi '

2
正则表达式版本是最快的。我使用了[^\x20-\x7E]而不是[^\x00-\x7f],以便从0到31和127中删除ASCII控制字符。 - user

9

虽然@Moinuddin Quadri的回答更适合您的用例,但通常从给定字符串中删除非ASCII字符的简单方法如下:

# the characters '¡' and '¢' are non-ASCII
string = "hello, my name is ¢arl... ¡Hola!"

all_ascii = ''.join(char for char in string if ord(char) < 128)

这将导致:
>>> print(all_ascii)
"hello, my name is arl... Hola!"

你也可以这样做:
''.join(filter(lambda c: ord(c) < 128, string))

但这个方法大约比“char for char...”的方法慢30%。


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