2015-12-08 195 views
0

我有以下幾乎正常工作的正則表達式。包含和不包含字符的正則表達式

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é 
+0

快速[正則表達式測試](https://regex101.com/r/qZ0sY3/1)顯示正則表達式不匹配那些標點符號。你能提供一個小提琴來重現這個問題嗎? –

+0

你在找[單詞字符](https://docs.python.org/2/library/re.html#regular-expression-syntax)嗎?有一個字符類:'\ w'。這適用於我:'re.search(r「\ w +」,「España,olé!」)''。 – Jasper

回答

0

這是更好地使用碼點。這些字符的代碼點是

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

這似乎落在您的重音字符的範圍之外。

[a-zA-Z\x{E1}-\x{FA}\x{C1}-\x{DA}\x{F1}]+ 
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和'([a-zA-Z\xc3\xa1-\xc3\xba\xc3\x81-\xc3\x9a\xc3\xb1]+)'由蟒蛇閱讀,注意開始\xc3模式(也就是unicode的起始字節)。

您可以確認通過打印reprWORD_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 

簡化IT,你實際上是使用模式

a-zA-Z\x81-\xc3 

這最後的範圍,涵蓋了很多的人物!

相關問題