【问题标题】:How to find non-ascii characters in file using Regular Expression Python如何使用正则表达式 Python 在文件中查找非 ascii 字符
【发布时间】:2014-08-15 13:00:21
【问题描述】:

我有一串字符,包括 [a-z] 以及 á,ü,ó,ñ,å,... 等等。目前我正在使用正则表达式来获取文件中包含这些字符的每一行。

spanishList.txt 示例:

adan
celular
tomás
justo
tom
átomo
camara
rosa
avion

Python代码(charactersToSearch来自flask@application.route('/<charactersToSearch>')):

print (charactersToSearch)
#'átdsmjfnueó'
...
#encode
charactersToSearch = charactersToSearch.encode('utf-8')
query = re.compile('[' + charactersToSearch + ']{2,}$', re.UNICODE).match
words = set(word.rstrip('\n') for word in open('spanishList.txt') if query(word))
...

当我这样做时,我希望在文本文件中获得包含charactersToSearch 中字符的单词。它非常适用于没有特殊字符的单词:

...
#after doing further searching for other conditions, return list of found words.
return '<br />'.join(sorted(set(word for (word, path) in solve())))
>>> adan
>>> justo
>>> tom

唯一的问题是它会忽略文件中所有不是 ASCII 的单词。我也应该得到tomásátomo

我已尝试使用 ur'[...] 进行编码 UTF-8,但我无法让它适用于所有字符。文件和程序 (# -*- coding: utf-8 -*-) 也是 utf-8 格式。

【问题讨论】:

  • 你试过query = re.compile(u'[' + charactersToSearch + ']{2,}$', re.UNICODE).match而不是将charactersToSearch编码为utf8吗?而是将其保留为unicode?​​span>
  • 为了澄清,您是否认为á 是非ASCII 码?在扩展表中是 12 月 225 日。 (但也可以表示为a + 重音)
  • @JoranBeasley 是的。我已经尝试了两种方法,但每次我得到的单词列表都不包含任何特殊字符。
  • @zx81 我不知道如何回应。如何检查?

标签: python regex python-2.7 encoding utf-8


【解决方案1】:

不同的策略

我不确定如何在您当前的工作流程中解决它,所以我会建议不同的路线。

此正则表达式将匹配既不是空白字符也不是扩展 ASCII 范围内的字母的字符,例如 Aé。换句话说,如果您的某个词包含不属于该集合的奇怪字符,则正则表达式将匹配。

(?i)(?!(?![×Þß÷þø])[a-zÀ-ÿ])\S

当然,这也会匹配标点符号,但我假设我们只查看未标点符号列表中的单词。否则,排除标点符号并不太难。

在我看来,你的挑战是定义你的系列。

在 Python 中,你可以这样:

if re.search(r"(?i)(?!(?![×Þß÷þø])[a-zÀ-ÿ])\S", subject):
    # Successful match
else:
    # Match attempt failed

【讨论】:

    【解决方案2】:

    我感觉到你的痛苦。在 python2.x 中处理 Unicode 是一件令人头疼的事情。

    该输入的问题在于 python 将“á”视为原始字节字符串 '\xc3\xa1' 而不是 unicode 字符“u'\uc3a1'。因此,您需要在传递字符串到你的正则表达式中。

    将原始字节字符串更改为 unicode 字符串

    char = "á"
    ## print char yields the infamous, and in python unparsable "\xc3\xa1".
    ## which is probably what the regex is not registering.
    bytes_in_string = [byte for byte in char]
    string = ''.join([str(hex(ord(byte))).strip('0x') for byte in bytes_in_string])
    new_unicode_string = unichr(int(string),16))
    

    可能有更好的方法,因为这是为正则表达式准备的大量操作,我认为这在某种程度上应该比迭代和“if/else”更快。 不过不知道,不是专家。

    当我解析维基词典时,我使用了类似的东西来隔离特殊的字符词,这是一个邪恶的混乱。据我所知,无论如何您都必须梳理一下以进行清理,您不妨这样做:

    for word in file:
        try:
            word.encode('UTF-8')
        except UnicodeDecodeError:
            your_list_of_special_char_words.append(word)
    

    希望这会有所帮助,祝你好运!

    进一步研究发现这篇文章:

    Bytes in a unicode Python string

    【讨论】:

    • 因此,当我尝试从原始字节字符串更改为 unicode 时出现错误。假设áaceimsonñpórxül的输入文本,bytes_in_string给我:['\xc3', '\xa1', 'a', 'c', 'e', 'i', 'm', 's', 'o', 'n', '\xc3', '\xb1', 'p', '\xc3', '\xb3', 'r', 'x', '\xc3', '\xbc', 'l'],然后字符串打印c3a1616365696d736f6ec3b17c3b37278c3bc6c。现在我可以看到,例如,á 由 \xc3 和 \xa1 组成。当我运行new_unicode_string 时,我得到的错误是:ValueError: invalid literal for int() with base 10: 'c3a1616365696d736f6ec3b17c3b37278c3bc6c'...因为它不仅仅是数字。有什么建议吗?
    • 我能够解决这个问题:
    【解决方案3】:

    能够找出问题所在。从烧瓶应用程序路由中获取字符串后,对其进行编码,否则会出错,然后对文件中的charactersToSearch 和每个word 进行解码。

    charactersToSearch = charactersToSearch.encode('utf-8')
    

    然后用 UTF-8 解码。如果你把上一行去掉,它会给你一个错误

    UNIOnlyAlphabet = charactersToSearch.decode('UTF-8')
    query = re.compile('[' + UNIOnlyAlphabet + ']{2,}$', re.U).match
    

    最后,在读取 UTF-8 文件并使用查询时,不要忘记对文件中的每个单词进行解码。

    words = set(word.decode('UTF-8').rstrip('\n') for word in open('spanishList.txt') if query(word.decode('UTF-8')))
    

    应该这样做。现在结果显示常规字符和特殊字符。

    justo
    tomás
    átomo
    adan
    tom
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 2012-11-21
      • 2018-07-24
      • 2013-02-19
      • 1970-01-01
      • 2011-01-03
      • 2016-10-02
      相关资源
      最近更新 更多