Python和带Unicode的正则表达式


83

我需要从字符串“ بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ”中删除一些Unicode符号

我知道他们肯定在这里。我试过了:

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

但这不起作用。字符串保持不变。我究竟做错了什么?

Answers:


110

您使用的是python 2.x还是3.0?

如果您使用的是2.x,请尝试使用“ u”使正则表达式字符串成为unicode-escape字符串。由于它是正则表达式,因此最好使用“ r”将正则表达式字符串设置为原始字符串。另外,将整个模式放在括号中也是多余的。

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

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

编辑:

将re.UNICODE / re.U /(?u)标志用于Unicode正则表达式也是一种好习惯,但它只会影响\ w或\ b这样的字符类别名,而该模式不使用任何别名,因此不会受到影响。


15
嗯,不知道您可以同时连接ur前缀。太酷了!
Balthazar Rouberol 2013年

6
@BalthazarRouberol我SyntaxError: invalid syntax 使用Python 3.6
Umair Ayub,

75

使用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
بسم الله الرحمن الرحيم

阅读Joel Spolsky的文章,名为《每个软件开发人员绝对绝对肯定要了解Unicode和字符集的绝对最低要求》(无借口!)


11
这篇文章很棒
Fluffy

@nosklo,为什么设置字符数的大括号({5})不能与unicode字符一起使用,我遇到了问题,但是+可以正常工作..您知道吗?谢谢!
securecurve

@securecurve我不知道,没有我的魔幻水晶球就无法帮助。我刚刚测试了它,对我来说效果很好。如果它对您不起作用,建议您提出一个新问题,并提供您的代码和得到的结果。
nosklo

4
如果要re在python中使用,则必须知道它不支持Unicode字符属性(例如\p{L})。pypi.python.org/pypi/regex可以。
2013年

re.UNICODE标志是没用在这里,因为它不仅影响速记字符类\w\d\s
nhahtdh 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.