如何使用Regular Expression Python在文件中查找非ascii字符

时间:2014-06-25 05:12:18

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

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

spanishList.txt示例:

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

Python代码(charactersToSearch来自烧瓶@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

我已经尝试过使用你的[...]编码,UTF-8,但是我无法让它适用于所有角色。文件和程序(# -*- coding: utf-8 -*-)也在utf-8中。

3 个答案:

答案 0 :(得分:0)

不同的提示

我不确定如何在当前的工作流程中修复它,所以我建议采用不同的路线。

此正则表达式将匹配非空格字符或扩展ASCII范围内的字母,例如Aé。换句话说,如果你的一个单词包含一个不属于这个集合的奇怪字符,那么正则表达式将匹配。

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

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

在我看来,你的挑战是定义你的设置。

在Python中,您可以这样:

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

答案 1 :(得分:0)

我感觉到你的痛苦。在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))

可能有一种更好的方法,因为这是为了为正则表达式做准备而进行的大量操作,我认为它应该比某些方法更快,而不是迭代和“如果/ else'ing。 不过,不是专家。

当我解析wiktionary这是一个邪恶的混乱时,我使用类似的东西来隔离特殊的char字。据我所知,无论如何你都要梳理它以清理它,你可能只是:

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

答案 2 :(得分:0)

能够找出问题所在。从烧瓶应用程序路径获取字符串后,对其进行编码,否则会给出错误,然后解码文件中的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