如何在Python中的正则表达式中包含非ASCII字符

3
我有一个文本文件,逐行读取。在每一行中,如果存在特殊字符,则将特殊字符移除,并使用正则表达式来帮助实现此操作。
fh = open(r"abc.txt","r+")
    data = fh.read()
    #print re.sub(r'\W+', '', data)
    new_str = re.sub('[^a-zA-Z0-9\n\.;,?!$]', ' ', data)

所以,在我的数据中,我只保留字母数字和一些特殊符号,它们是[.;,?!$],但同时我也想要欧元符号(€)、英镑符号(£)、日元符号(¥)和卢比符号(₹)。但这些不属于ASCII字符,所以当我在正则表达式中包含它们时,如re.sub('[^a-zA-Z0-9\n.;,?!$€₹¥]', ' ', data),它会显示错误信息。 SyntaxError:文件preprocess.py的第23行存在非ASCII字符'\xe2',但未声明编码。


1
你使用的编码是什么?你使用UTF-8吗? - user6409506
也许相关:https://dev59.com/MnA75IYBdhLWcg3wqLD_ - user2864740
1
一个解决方法可能是指定一个 Unicode 范围而不是单独指定字符(参见此处)。但是,如果您想要保留的字符不能完全适用于单个范围,则这种方法可能不够简洁。 - Tim Biegeleisen
1
请说明您使用的是Python 2还是3。如果是Python 2,您是否在文件顶部使用了编码行? - Hubert Grzeskowiak
请注意,正如提到的那样,在Python3中所有字符串都是UTF-8编码。如果您正在使用原始字节,则需要使用b'前缀。 - user6409506
显示剩余3条评论
2个回答

0

您可以使用Unicode字符转义。例如,上面的欧元符号可以表示为\u20ac。四位数字是Unicode编号,与编码类型无关。在正则表达式示例中,可能如下所示:

[^a-zA-Z0-9\u20ac]

我已经尝试过这种方法,但是这种方式不起作用。 - Mridul Sachan
当你说它“不起作用”时,是指你的正则表达式不匹配还是仍然出现“SyntaxError: Non-ASCII character '\xe2' in file preprocess.py on line 23”? - entpnerd
我没有收到任何错误,但它没有保留那个特殊符号。在输出中,像欧元这样的符号被删除了。 - Mridul Sachan
尝试使用 re.sub('<regex>', ' ', data, 0, re.UNICODE) - entpnerd
它在Python 3中可以工作,但在Python 2中无法工作。 - Mridul Sachan

0

也许不是最终解决方案,但可能是部分解决方案。在你的每个 Python 2 文件的前两行中使用这段代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

这使得Python 2切换到UTF-8(unicode)模式。在Python 3中,这是默认设置。


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