Python和带有Unicode的正则表达式

bsn*_*bsn 81 python regex character-properties

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

我知道他们肯定存在于这里.我试过了:

re.sub('([\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+)', '', '?????? ??????? ???????????? ??????????')
Run Code Online (Sandbox Code Playgroud)

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

ʞɔı*_*ɔıu 107

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

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

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

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

编辑:

对于unicode正则表达式使用re.UNICODE/re.U /(?u)标志也是一种好习惯,但它只影响\ w或\ b之类的字符类别名,其中此模式不使用任何字符串别名,因此不会受到影响.

  • 嗯,不知道你可以连接``u``和``r``前缀.那太酷了! (14认同)
  • @BalthazarRouberol 我在 Python 3.6 中得到 `SyntaxError: invalid syntax` (6认同)
  • 请注意,这仅适用于Python 2 (2认同)

nos*_*klo 69

使用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
??? ???? ?????? ??????
Run Code Online (Sandbox Code Playgroud)

阅读Joel Spolsky所说的绝对最低限度的软件开发人员的文章,正确地必须知道Unicode和字符集(没有借口!)

  • 这篇文章太棒了 (9认同)
  • 如果你想在python中使用`re`,你必须知道它不支持Unicode字符属性(比如`\ p {L}`).http://pypi.python.org/pypi/regex可以. (3认同)