繁体   English   中英

包含和排除字符的正则表达式

[英]Regular expression including and excluding characters

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

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é

根据文档,使用特殊序列'\\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 起始字节)。

您可以通过打印WORD_REGEXPrepr来确认这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

最后一个范围,涵盖了很多字符!!

最好使用代码点。 这些字符的代码点是

¡ - \x{A1}
¿ - \x{BF}  

这似乎超出了您的重音字符的范围。

 [a-zA-Z\x{E1}-\x{FA}\x{C1}-\x{DA}\x{F1}]+ 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM