2013-03-05 64 views
1

考慮使用正則表達式這個片段在Python 3:的規則運算非ASCII字符

>>> t = "Meu cão é #paraplégico$." 
>>> re.sub("[^A-Za-z0-9 ]","",t,flags=re.UNICODE) 
'Meu co paraplgico' 

爲什麼它刪除非ASCII字符?我試過沒有旗幟,都是一樣的。

作爲獎勵,任何人都可以在Python 2.7上做這項工作嗎?

+0

我使用Python 3.2 – fccoelho 2013-03-05 12:09:11

+0

因爲'A-z'是'ABCDEF ...... xyz'而這並不包括'了'。如果你想要所有的單詞字符,使用'\ w'。 – 2013-03-05 12:53:57

回答

2
[In 1]: import regex 
[In 2]: t = u"Meu cão é #paraplégico$." 
[In 3]: regex.sub(r"[^\p{Alpha} ]","",t,flags=regex.UNICODE) 
[In 4]: print(regex.sub(r"[^\p{Alpha} ]","",t,flags=regex.UNICODE)) 

MEU曹娥paraplégico

5

您正在用空白("")替換非字母數字字符([^A-Za-z0-9 ])。非ASCII字符不在A-Z,a-z或0-9之間,因此它們會被替換。

可以匹配所有單詞字符是這樣的:

>>> t = "Meu cão é #paraplégico$." 
>>> re.sub("[^\w ]","",t, flags=re.UNICODE) 
>>> 'Meu cão é paraplégico' 

或者你可以將角色添加到您的正則表達式,像這樣:[^A-Za-z0-9ãé ]

+0

是的,我明白了!但是Unicode中的A-Za-z等價於什麼? – fccoelho 2013-03-05 12:17:26

+0

@fccoelho我已經更新了答案 – Yeonho 2013-03-05 12:32:35

+2

在許多(其他)語言中,您可以使用Unicode屬性來定義「[^ \ p {Alpha}]」的正則表達式。請參閱http://stackoverflow.com/questions/1832893/python-regex-matching-unicode-properties在Python中的替代方案。 – Joe 2013-03-05 12:40:04

0

我通過切換到regex庫(一封來自PyPI)解決了這個。

那麼正則表達式的命令變成了:

regex.sub(ur"[^\p{L}\p{N} ]+", u"", t)