如何指定 unicode 字符范围

问题描述 投票:0回答:2

如何指定从

' '
(空格)到
\u00D7FF
的 unicode 字符范围?

我有一个像

r'[\u0020-\u00D7FF]'
这样的正则表达式,它不会编译,因为它是一个错误的范围。我是 Unicode 正则表达式的新手,所以以前没有遇到过这个问题。

有没有办法让这个编译或者我忘记或还没学过的正则表达式?

regex unicode python-2.x
2个回答
35
投票

您的 unicode 范围的语法不会达到您的预期。

  1. 原始

    r''
    字符串会阻止
    \u
    转义被解析,并且正则表达式引擎不会执行此操作。该集合中唯一的范围是
    [0-\]
    :

    >>> re.compile(r'[\u0020-\u00d7ff]', re.DEBUG)
    in
      literal 117
      literal 48
      literal 48
      literal 50
      range (48, 117)
      literal 48
      literal 48
      literal 100
      literal 55
      literal 102
      literal 102
    
  2. 将其设为 Unicode 文字会导致

    \u
    解析,同时保留其他反斜杠(尽管这不是这里的问题),但前导零将其搞乱。语法为
    \uxxxx
    \Uxxxxxxxx
    ,因此解析为“
    \u00d7
    ,
    f
    ,
    f
    ”。

    >>> re.compile(ur'[\u0020-\u00d7ff]', re.DEBUG)
    in
      range (32, 215)
      literal 102
      literal 102
    
  3. 删除前导零或切换到

    \U0000d7ff
    将修复它:

    >>> re.compile(ur'[\u0020-\ud7ff]', re.DEBUG)
    in
      range (32, 55295)
    

5
投票

如果您使用的是 Python 2.x,则应确保指定一个 unicode 字符串(使用 u'' 或内置的“unicode”):

>>> r = re.compile(u'[\u0020-\uD7FF]')
>>> r.search(u'foo \uD7F0 bar')
<_sre.SRE_Match object at 0xb7084950>
r.search(u' ')
<_sre.SRE_Match object at 0xb7084b48>

使用原始字符串(就像你一样,使用 r'')会得到由“backlines”+字母“u”加上数字 0 加...组成的 (ascii) 字符串。

© www.soinside.com 2019 - 2024. All rights reserved.