2015-11-18 557 views
0

我試圖從unicode字符串中刪除標點符號,該字符串可能包含非ascii字母。我嘗試使用regex模塊:從unicode字符串去除特殊字符和標點符號

import regex 
text = u"<Üäik>" 
regex.sub(ur"\p{P}+", "", text) 

不過,我已經注意到,人物<>沒有得到清除。有誰知道爲什麼,有沒有其他方式來從Unicode字符串中去除標點符號?

編輯:我已經嘗試了另一種方法是這樣做的:

import string 
text = text.encode("utf8").translate(None, string.punctuation).decode("utf8") 

,但我想,以避免文本從Unicode轉換爲字符串和倒退。

+1

你應該定義是什麼標點符號。特別是在unicode中,根據您的語言,這可能會有很多字符和字符組合。 –

+1

你不需要在高位轉換爲UTF-8來使用'unicode.translate()'。使用'text.translate(dict.fromkeys(ord(c)for string.punctuation))'。 –

+0

而'\ p {P}'不包括'<' as '>';那些沒有被分類爲標點符號。它們是[數學符號(Sm)](https://codepoints.net/search?gc=Sm)chodepoints。 –

回答

2

<>被分類爲Math Symbols (Sm),不標點符號(P)。你可以匹配:

regex.sub('[\p{P}\p{Sm}]+', '', text) 

unicode.translate()方法存在太和花費字典映射整數(碼點),以任一其它整數碼點​​,Unicode字符,或None; None刪除該代碼點。地圖string.punctuation到碼點與ord()

text.translate(dict.fromkeys(ord(c) for c in string.punctuation)) 

那只是只刪除的ASCII標點字符的數量有限。

演示:

>>> import regex 
>>> text = u"<Üäik>" 
>>> print regex.sub('[\p{P}\p{Sm}]+', '', text) 
Üäik 
>>> import string 
>>> print text.translate(dict.fromkeys(ord(c) for c in string.punctuation)) 
Üäik 
+0

我在運行''regex.sub('[\ p {P} \ p {Ms}] +','',text)時出錯'_regex_core.error:位置12處的未知屬性' – SIslam

+0

@SIslam:my錯誤,我得到了類的縮寫錯誤。我已經在我的回答中糾正了它。 –

1

嘗試string模塊

import string,re 
text = u"<Üäik>" 
out = re.sub('[%s]' % re.escape(string.punctuation), '', text) 
print out 
print type(out) 

Prints-

Üäik 
<type 'unicode'> 
0

\p{P}匹配標點符號。

那些標點符號都

! ' # S % & ' () * + , - ./: ; <=> ? @ [/]^_ { | } ~ 

<>沒有標點符號。所以他們不會被刪除。

試試這個

re.sub('[\p{L}<>]+',"",text) 
相關問題