Python 和带有 Unicode 的正则表达式

Posted

技术标签:

【中文标题】Python 和带有 Unicode 的正则表达式【英文标题】:Python and regular expression with Unicode 【发布时间】:2010-09-28 11:23:27 【问题描述】:

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

我知道它们肯定存在于此。我试过了:

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

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

【问题讨论】:

【参考方案1】:

您使用的是 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

编辑:

对 unicode 正则表达式使用 re.UNICODE/re.U/(?u) 标志也是一种很好的做法,但它只影响像 \w 或 \b 这样的字符类别名,此模式不使用任何和所以不会受到影响。

【讨论】:

嗯,不知道你可以连接 ur 前缀。太酷了! @BalthazarRouberol 我在 Python 3.6 中得到 SyntaxError: invalid syntax【参考方案2】:

使用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 的文章 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

【讨论】:

@nosklo,为什么设置字符数的花括号 - 5 - 不适用于 unicode 字符,我遇到了问题,但是 + 工作正常。 。你有什么主意吗?谢谢! @securecurve 我不知道,没有我的魔法水晶球就没有办法提供帮助。我刚刚测试了它,它对我来说很好用。如果它不适合你,我建议你提出一个新问题,提供你的代码和你得到的结果。 如果你想在python中使用re,你必须知道它不支持Unicode字符属性(比如\pL)。 pypi.python.org/pypi/regex 确实如此。 re.UNICODE 标志在这里没有用,因为它只影响速记字符类\w\d\s

以上是关于Python 和带有 Unicode 的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

用于 unicode 大写单词的 Python 正则表达式

带有 unicode 和标点符号的 Javascript 正则表达式

PHP - 带有 unicode 正则表达式的 XSD 模式验证错误

python 在python正则表达式中找到unicode表情符号

如何在 python 的正则表达式中指定一系列 unicode 字符? [复制]

如何使用正则表达式可移植地解析(Unicode)度数符号?