2008-12-26 109 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