我有以下几乎正常工作的正则表达式。
WORD_REGEXP = re.compile(r"[a-zA-Zá-úÁ-Úñ]+")
它包括带和不带重音的小写和大写字母以及西班牙语字母«ñ»。不幸的是,它还包括(我不知道为什么)在西班牙语中使用的字符,如«¡»或«¿»,我也想删除。
在像¡España, olé!
这样的行中,我想通过正则表达式提取España
和olé
。
如何在正则表达式中排除这两个字符(«¿»,«¡»)?
根据stribizhe,似乎正则表达式是好的。所以问题必须是其他问题。我包含完整的Python代码:
import re
linea = "¡Arriba Éspáña, ¿olé!"
WORD_REGEXP = re.compile(r"([a-zA-Zá-úÁ-Úñ]+)", re.UNICODE)
palabras = WORD_REGEXP.findall(linea)
for pal in palabras:
pal = unicode(pal,'latin1').encode('latin1', 'replace')
print pal
结果如下:
¡Arriba
Éspáña
¿olé
答案 0 :(得分:1)
根据文档:
使用特殊序列'\w'
如果设置了UNICODE,这将匹配字符[0-9_]以及Unicode字符属性数据库中分类为字母数字的字符。
但请注意,您的字符串必须是unicode字符串:
import re
linea = u"¡Arriba Éspáña, ¿olé!"
regex = re.compile(r"\w+", re.UNICODE)
regex.findall(linea)
# [u'Arriba', u'\xc9sp\xe1\xf1a', u'ol\xe9']
注意:错误的原因是您的正则表达式被解释为UTF-8,例如:
您的模式r'([a-zA-Zá-úÁ-Úñ]+)'
未定义为unicode字符串,因此它由文本编辑器编码为UTF-8,并由python作为'([a-zA-Z\xc3\xa1-\xc3\xba\xc3\x81-\xc3\x9a\xc3\xb1]+)'
读取,请注意以\xc3
开头的模式(即unicode起始字节)。
您可以打印repr
WORD_REGEXP
来确认。因此re
模块使用的实际模式是:
patt = r"([a-zA-Zá-úÁ-Úñ]+)"
print patt.decode('latin1')
或者:
a-z
A-Z
\xc3
\xa1-\xc3
\xba
\xc3
\x81-\xc3
\x9a
\xc3
\xb1
简化它,你实际上是在使用模式
a-zA-Z\x81-\xc3
最后一个范围,涵盖了很多角色!!
答案 1 :(得分:0)
使用代码点更好。这些字符的代码点是
¡ - \x{A1}
¿ - \x{BF}
似乎超出了你的重音字符范围。
[a-zA-Z\x{E1}-\x{FA}\x{C1}-\x{DA}\x{F1}]+