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

Python-替换字符串中的非ascii字符(»;),python,regex,string,encoding,decoding,Python,Regex,String,Encoding,Decoding,我需要将字符串中的字符“»”替换为空白,但仍然会出现错误。这是我使用的代码: # -*- coding: utf-8 -*- from bs4 import BeautifulSoup # other code soup = BeautifulSoup(data, 'lxml') mystring = soup.find('a').text.replace(' »','') UnicodeEncodeError:“ascii”编解码器无法在中编码字符u'\xbb' 位置13:序号不在范围内

我需要将字符串中的字符“»”替换为空白,但仍然会出现错误。这是我使用的代码:

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

# other code

soup = BeautifulSoup(data, 'lxml')
mystring = soup.find('a').text.replace(' »','')
UnicodeEncodeError:“ascii”编解码器无法在中编码字符u'\xbb' 位置13:序号不在范围内(128)

但如果我用另一个脚本测试它:

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

它起作用了。为什么会这样?

为了使用
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 '

@Moinuddin Quadi的答案更适合您的用例,但一般来说,从给定字符串中删除非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)
您也可以这样做:

''.join(filter(lambda c: ord(c) < 128, string))
连接(过滤器(lambda c:ord(c)<128,字符串))
但是这比用字符替换字符的方法慢了大约30%。

通过谷歌搜索你得到的错误,我得到了答案:应该有你可以使用的东西,正则表达式版本是最快的。我没有使用
[^\x00-\x7f]
而是使用
[^\x20-\x7E]
将ASCII控制字符从0删除到31和127。
''.join(filter(lambda c: ord(c) < 128, string))