代码之家  ›  专栏  ›  技术社区  ›  spig

如何指定Unicode字符的范围

  •  22
  • spig  · 技术社区  · 14 年前

    如何指定一个Unicode字符范围 ' ' (空格)到 \u00D7FF ?

    我有一个正则表达式 r'[\u0020-\u00D7FF]' 它不会编译说这是一个坏的范围。我不熟悉Unicode正则表达式,所以以前没有遇到过这个问题。

    有没有一种方法可以使这个编译或者一个我忘记或者还没学会的正则表达式?

    2 回复  |  直到 12 年前
        1
  •  27
  •   Josh Lee ZZ Coder    12 年前

    您的unicode范围的语法将不能满足您的期望。

    1. 原始的 r'' 字符串阻止 \u 从被分析中逸出,而regex引擎不会这样做。这个集合中的唯一范围是 [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文本 causes \u parsing while leaving other backslashes alone (虽然这不是一个问题),但前导零位把它弄乱了。语法是 \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)
      
        2
  •  5
  •   rbp zifot    14 年前

    如果您使用的是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“”)可以得到由“backstroke”+字母“u”加数字0+组成的(ASCII)字符串…