正则表达式字符类[ - /]有效但[/ - ]没有

时间:2017-08-31 18:51:30

标签: python

  1. 请解释为什么第一个字符类正在工作,而不是第二个字符类
  2. 这确实有效:

    p = re.compile("\d\d[.-/ ]\d\d[.-/ ]\d\d\d\d")
    

    这不起作用:

    p = re.compile("\d\d[./- ]\d\d[./- ]\d\d\d\d")
    

    追踪(最近一次呼叫最后一次):

      File "C:/pyprg/prac01.py", line 2, in <module>
            p = re.compile("\d\d[./- ]\d\d[./- ]\d\d\d\d")   File "C:\Python361\lib\re.py", line 233, in compile
            return _compile(pattern, flags)   File "C:\Python361\lib\re.py", line 301, in _compile
            p = sre_compile.compile(pattern, flags)   File "C:\Python361\lib\sre_compile.py", line 562, in compile
            p = sre_parse.parse(p, flags)   File "C:\Python361\lib\sre_parse.py", line 856, in parse
            p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, False)   File "C:\Python361\lib\sre_parse.py", line 415, in _parse_sub
            itemsappend(_parse(source, state, verbose))   File "C:\Python361\lib\sre_parse.py", line 552, in _parse
            raise source.error(msg, len(this) + 1 + len(that)) sre_constants.error: bad character range /-  at position 6
    

1 个答案:

答案 0 :(得分:0)

范围表达式中的破折号具有特殊含义(如下面的python正则表达式文档所述)。由于它被解释为范围,因此第一个示例的范围是ascii“。” ascii“/”(hex 2E - 2F)。在第二个范围内,ascii“/”ascii“”(hex 2F - 20)是一个非连续的ASCII范围,导致错误。我猜这不是你想要的,可能想把它作为\ _来解决它,所以它被解释为一个文字字符。

字符范围可以通过给出两个字符并用' - '分隔来表示,例如[az]将匹配任何小写的ASCII字母,[0-5] [0-9]将匹配所有两个字符 - 数字从00到59,[0-9A-Fa-f]将匹配任何十六进制数字。如果 - 被转义(例如[a-z])或者它被放置为第一个或最后一个字符(例如[a-]),它将匹配文字“ - ”。