这确实有效:
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
答案 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-]),它将匹配文字“ - ”。