【问题标题】:How to include Non-ascii characters in regular expression in Python如何在 Python 的正则表达式中包含非 ascii 字符
【发布时间】:2018-07-24 15:07:46
【问题描述】:

我有一个文本文件,我正在逐行阅读。在每一行中,如果有特殊字符,那么我将删除特殊字符,为此,我正在使用正则表达式的帮助。

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:第 23 行文件 preprocess.py 中的非 ASCII 字符“\xe2”,但未声明编码

【问题讨论】:

  • 您使用的是什么编码?你使用的是 UTF-8 吗?
  • stackoverflow.com/questions/393843/… 看起来您的编码不正确
  • 一种解决方法可能是指定一个 Unicode 范围 (see here)。但是,如果您想要保留的字符不能整齐地放在一个范围内,那可能就不干净了。
  • 请说明您使用的是 Python 2 还是 Python 3。如果是 Python 2,您使用的是文件顶部的编码行吗?

标签: python regex ascii non-ascii-characters


【解决方案1】:

也许不是解决方案,但可能是部分解决方案。将其用作每个 Python 2 文件的前两行:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我已经尝试过这样做,但是这个方法不起作用。
    • 当你说它“不工作”时,你的意思是你的正则表达式不匹配还是你仍然得到SyntaxError: Non-ASCII character '\xe2' in file preprocess.py on line 23
    • 我没有收到任何错误,但它没有保留那个特殊符号。在输出中,像欧元这样的符号被删除了。
    • 尝试使用re.sub('<regex>', ' ', data, 0, re.UNICODE)
    • 它在 Python 3 中工作,但在 Python 2 中不工作。
    猜你喜欢
    • 2012-11-21
    • 2013-02-19
    • 1970-01-01
    • 2011-01-03
    • 2013-01-28
    • 2011-01-08
    • 2014-08-15
    • 2013-09-22
    • 1970-01-01
    相关资源
    最近更新 更多