2008-12-26 67 views
68

正則表達式我需要從字符串刪除一些Unicode的符號「بسماللهالرحمنالرحيم」Python和使用Unicode

我知道他們存在這裏肯定。我試過了:

re.sub('([\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+)', '', 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ') 

但它不起作用。字符串保持不變。我究竟做錯了什麼?

回答

87

你使用的是Python 2.x還是3.0?

如果您使用的是2.x,請嘗試使用「u」將正則表達式字符串設置爲unicode轉義字符串。由於它是正則表達式,所以將正則表達式字符串設爲原始字符串是'好'的做法。另外,將整個模式放在括號中是多餘的。

re.sub(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', '', ...) 

http://docs.python.org/tutorial/introduction.html#unicode-strings

編輯:

這也是使用re.UNICODE/re.U/Unicode的正則表達式標誌很好的做法,但它不僅影響性格類別名狀(U?) \ w或\ b,其中這種模式不使用任何,所以不會受到影響。

+9

嗯,閱讀文章不知道,你可以串連兩個``u``和``r``前綴。這很酷! – 2013-03-12 09:16:03

58

使用unicode字符串。使用re.UNICODE標誌。

>>> myre = re.compile(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', 
         re.UNICODE) 
>>> myre 
<_sre.SRE_Pattern object at 0xb20b378> 
>>> mystr = u'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ' 
>>> result = myre.sub('', mystr) 
>>> len(mystr), len(result) 
(38, 22) 
>>> print result 
بسم الله الرحمن الرحيم 

通過喬爾斯波斯基稱爲The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

+8

這篇文章太棒了 – Fluffy 2009-11-08 15:48:36