正则表达式包括和排除字符

时间:2015-12-08 18:38:26

标签: python regex

我有以下几乎正常工作的正则表达式。

WORD_REGEXP = re.compile(r"[a-zA-Zá-úÁ-Úñ]+")

它包括带和不带重音的小写和大写字母以及西班牙语字母«ñ»。不幸的是,它还包括(我不知道为什么)在西班牙语中使用的字符,如«¡»或«¿»,我也想删除。

在像¡España, olé!这样的行中,我想通过正则表达式提取Españaolé

如何在正则表达式中排除这两个字符(«¿»,«¡»)?

根据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é

2 个答案:

答案 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}]+