如何从列表中移除'\xe2

8 投票
6 回答
16642 浏览
提问于 2025-04-16 01:48

我刚开始学习Python,正在我的项目中使用nltk。通过对从网页获取的原始数据进行分词,我得到了一个列表,里面有像'\xe2'、'\xe3'、'\x98'这样的内容。但我不需要这些,想把它们删掉。

我简单地尝试了

if '\x' in a

if a.startswith('\xe')

结果出现了一个错误,提示说无效的\x转义。

但是当我尝试使用正则表达式

re.search('^\\x',a)

时,我得到了

Traceback (most recent call last):
File "<pyshell#83>", line 1, in <module>
print re.search('^\\x',a)
File "C:\Python26\lib\re.py", line 142, in search
return _compile(pattern, flags).search(string)
File "C:\Python26\lib\re.py", line 245, in _compile
raise error, v # invalid expression
error: bogus escape: '\\x'

即使是re.search('^\\x',a)也没有识别出来。

我对此感到困惑,连谷歌搜索也没能帮到我(可能我漏掉了什么)。请给我推荐一种简单的方法来从列表中删除这些字符串,以及上面代码有什么问题。

提前谢谢你!

6 个回答

6

'\xe2' 是一个字符,\x 是一个转义序列,后面跟着一个十六进制数字,用来字面上表示一个字节。
这意味着你需要指定整个表达式:

>>> s = '\xe2hello'
>>> print s
'\xe2hello'
>>> s.replace('\xe2', '')
'hello'

更多信息可以在 Python 文档 中找到。

19

你可以使用 unicode(a, 'ascii', 'ignore') 这个方法,一下子把字符串中所有不是ASCII字符的内容都去掉。

11

这里需要理解字符串字面量和字符串之间的区别。

字符串字面量是你在源代码中写的一串字符。当这些字符被Python解释器解析和编译后,就会变成一个字符串,也就是在内存中存储的一串字符。

举个例子,字符串字面量 " a " 生成的字符串就是 a

字符串字面量可以有多种形式。所有这些形式都会生成相同的字符串 a

"a"
'a'
r"a"
"""a"""
r'''a'''

传统上,源代码只使用ASCII字符,但我们希望它能包含生成超出ASCII范围的字符的字符串字面量。为此,可以使用转义字符。例如,字符串字面量 "\xe2" 生成一个单字符字符串,这个字符的整数值是E2(十六进制),也就是226(十进制)。

这就解释了关于 "\x" 是无效转义的错误:解析器期待你指定一个字符的十六进制值。

要检测一个字符串是否包含某个范围内的字符,可以使用正则表达式,结合字符类来指定你不想要的字符的上下限:

if re.search(r"[\x90-\xff]", a):

撰写回答