我有一串字符,包括[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中。
答案 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)
希望这有帮助,祝你好运!
进一步研究发现这篇文章:
答案 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