Python 如何删除'\xe2&x27;从列表中
我是python新手,在我的项目中使用它来使用nltk。对从网页获得的原始数据进行word标记后,我得到了一个包含“\xe2”、““\xe3”、““\x98”等的列表。但是我不需要这些,我想删除它们 我只是试了一下Python 如何删除'\xe2&x27;从列表中,python,regex,Python,Regex,我是python新手,在我的项目中使用它来使用nltk。对从网页获得的原始数据进行word标记后,我得到了一个包含“\xe2”、““\xe3”、““\x98”等的列表。但是我不需要这些,我想删除它们 我只是试了一下 if '\x' in a 及 它给我一个错误,说无效\x转义 但是当我尝试正则表达式时 re.search('^\\x',a) 我明白了 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 打印重新搜索('^\\x',a) 文件“C:\Python26\lib\re.py”,第
if '\x' in a
及
它给我一个错误,说无效\x转义
但是当我尝试正则表达式时
re.search('^\\x',a)
我明白了
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
打印重新搜索('^\\x',a)
文件“C:\Python26\lib\re.py”,第142行,搜索中
返回编译(模式、标志)。搜索(字符串)
文件“C:\Python26\lib\re.py”,第245行,在编译中
raise错误,v#表达式无效
错误:假转义:'\\x'
即使重新搜索('^\\x',a)也无法识别它
我对此感到困惑,甚至谷歌搜索也没有帮助(我可能遗漏了一些东西)。请给出从列表中删除这些字符串的简单方法,以及上面的错误
提前谢谢
'\xe2'
是一个字符,\x
是一个转义序列,后跟一个十六进制数,用于逐字指定字节。这意味着您必须指定整个表达式:
>>> s = '\xe2hello'
>>> print s
'\xe2hello'
>>> s.replace('\xe2', '')
'hello'
更多信息可以在中找到。您可以使用
unicode(a'ascii',ignore')
一次删除字符串中的所有非ascii字符。这有助于理解字符串文字和字符串之间的区别
字符串文本是源代码中的一个字符序列。当Python解释器进行解析和编译时,它会生成一个字符串,这是内存中的一个字符序列
例如,字符串literal“
a
”
生成字符串a
字符串文字可以采用多种形式。所有这些都产生相同的字符串a
:
"a"
'a'
r"a"
"""a"""
r'''a'''
源代码传统上仅为ASCII码,但我们希望它包含可以生成ASCII码以外字符的字符串文字。为此,可以使用转义。例如,字符串文字“\xe2”
生成一个字符串,其中一个字符的整数值为E2十六进制或226十进制
这解释了关于“\x”
是无效转义的错误:解析器希望您指定字符的十六进制值
要检测字符串是否在某个范围内包含任何字符,可以使用正则表达式和字符类,指定不需要的字符的上下限:
if re.search(r"[\x90-\xff]", a):
让我们往后退一步,想一想这件事 您正在使用nltk(自然语言工具包)解析(大概)自然语言 您的
'\xe2'
很可能用扬抑符(–)表示U+00E2拉丁文小写字母A。您的
“\xe3”
很可能用波浪号(ã)表示U+00E3拉丁文小写字母A
在我看来,它们就像自然语言字母。您确定不需要它们吗?我看到其他答案很好地解释了您对
'\x'
的困惑,但尽管建议您可能不想完全删除非ASCII字符,但除了删除之外,还没有提供其他规范化的具体方法
如果您希望获得一些“相当接近的ASCII字符”(例如,从字母中去掉重音符号,但保留基础字母,&c),可能会有所帮助——仅使用标准Python库的公认答案中的代码是:
import unicodedata
def strip_accents(s):
return ''.join(c for c in unicodedata.normalize('NFD', s)
if unicodedata.category(c) != 'Mn')
当然,您需要将此函数应用于标题中提到的列表中的每个字符串项,例如
cleanedlist = [strip_accents(s) for s in mylist]
如果
mylist
中的所有项目都是字符串。如果只想输入此模式并避免错误
您可以尝试在\和x之间插入一个+,如下所示:
re.search('\+x[0123456789abcdef]*',a)
嗨,谢谢你的回复!实际上,我正试图从网页中提取数字,所以我不需要拉丁字符。@pythonisgr8:(1)您正在使用nltk提取数字??(2) “拉丁语”并不意味着“口音”;注释中几乎所有的字符都是“拉丁”(3)如果您只提取数字,那么
'abracadabra'
中的'a'
字母是否带有重音并不重要;您不需要删除您不想要的字符来提取您想要的字符。也许你应该问另一个问题,描述你正在尝试做什么。嗨,谢谢你的回答!这真是太好了!!虽然正则表达式更适合我的项目。我喜欢这个解决方案,但是你知道Python 3的单行替代品吗?谢谢你的回复!虽然我目前不需要非ASCII字符,因为我正在提取数字及其上下文,但您的答案在将来可能会有所帮助!!
cleanedlist = [strip_accents(s) for s in mylist]
re.search('\+x[0123456789abcdef]*',a)