Python 详细正则表达式注释中的连字符导致错误
下面的代码有什么问题-我在注释中指出它是连字符,但为什么会导致错误Python 详细正则表达式注释中的连字符导致错误,python,regex,Python,Regex,下面的代码有什么问题-我在注释中指出它是连字符,但为什么会导致错误 import re valid = re.compile(r'''[^ \uFFFE\uFFFF # non-characters ]''', re.VERBOSE) Traceback (most recent call last): File "valid.py", line 5, in <module> ]''', re.VERBOSE) File "/usr/local/lib/py
import re
valid = re.compile(r'''[^
\uFFFE\uFFFF # non-characters
]''', re.VERBOSE)
Traceback (most recent call last):
File "valid.py", line 5, in <module>
]''', re.VERBOSE)
File "/usr/local/lib/python3.3/re.py", line 214, in compile
return _compile(pattern, flags)
File "/usr/local/lib/python3.3/re.py", line 281, in _compile
p = sre_compile.compile(pattern, flags)
File "/usr/local/lib/python3.3/sre_compile.py", line 494, in compile
p = sre_parse.parse(p, flags)
File "/usr/local/lib/python3.3/sre_parse.py", line 748, in parse
p = _parse_sub(source, pattern, 0)
File "/usr/local/lib/python3.3/sre_parse.py", line 360, in _parse_sub
itemsappend(_parse(source, state))
File "/usr/local/lib/python3.3/sre_parse.py", line 506, in _parse
raise error("bad character range")
sre_constants.error: bad character range
编辑:
除了@nhahtdh的答案之外,字符串连接似乎是以详细样式注释字符类的另一种合理方式:
valid = re.compile( r'[^'
r'\u0000-\u0008' # C0 block first segment
r'\u000Bu\u000C' # allow TAB U+0009, LF U+000A, and CR U+000D
r'\u000E-\u001F' # rest of C0
r'\u007F' # disallow DEL U+007F
r'\u0080-\u009F' # All C1 block
r']' # don't forget this!
r'''
| [0-9] # normal verbose style
| [a-z] # another term +++
''', re.VERBOSE)
根据文件(重点矿山):
re.X
re.VERBOSE
此标志允许您编写外观更好的正则表达式模式中的空白将被忽略,除非在字符类中或前面有一个未缩放的反斜杠,并且当一行既不在字符类中也不在前面有一个未缩放的反斜杠时,从最左边的“#”到行尾的所有字符都将被忽略。
基本上,字符类内不能有注释,字符类内的空白被认为是重要的
由于#
位于character类内部,因此它不起注释的作用,character类内部的所有内容都将毫无例外地作为character类的一部分进行解析(甚至新行字符也将作为character类的一部分进行解析)。由于n-c
是无效的字符范围,因此引发错误
编写表达式的有效方法是:
valid = re.compile(r'[^\uFFFE\uFFFF] # non-characters', re.VERBOSE)
下面是一条建议,当您想要解释一个冗长的字符类时,如何进行注释:
r'''
# LOTS is for foo
# _ is a special fiz
# OF-LITERAL is for bar
[^LOTS_OF-LITERAL]
'''
注释在正则表达式中并不总是起到很好的作用,而且您的正则表达式引擎似乎正在将连字符作为正则表达式的一部分进行解析。你不能依赖没有在这里解析的注释。在实现这段代码之前,这是一件很好的事情。令人惊讶的是,我编写了一个包含许多注释的冗长的多行字符类regex,这是唯一的错误点。这很容易被忽略。一个值得注意的问题。谢谢,这是下一个问题:在这种情况下如何添加评论。但问题是,这是一个包含许多范围和文本的冗长类的一部分。@BaselShishani:正如文档中提到的,注释不起作用,并且在正则表达式中空格很重要。一种解决方案是在注释中复制regex,您可以随意添加注释,而不会影响正在运行的代码。
r'''
# LOTS is for foo
# _ is a special fiz
# OF-LITERAL is for bar
[^LOTS_OF-LITERAL]
'''