4

次のコードの何が問題なのですか - コメントのハイフンに特定しましたが、なぜエラーが発生するのでしょうか?

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

ハイフンのない次のセグメントにはエラーはありません。

import re

valid = re.compile(r'''[^
\uFFFE\uFFFF   # non characters !! no errors
]''', re.VERBOSE)

編集:

@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)
4

2 に答える 2

7

ドキュメントによると(強調鉱山):

re.X
re.VERBOSE

このフラグを使用すると、見栄えの良い正規表現を記述できます。パターン内の空白は無視されます。ただし、文字クラス内またはエスケープされていないバックスラッシュが前にある場合、および文字クラス内またはエスケープされていないバックスラッシュが前にない「#」が行に含まれている場合は、そのような「#」の左端からすべての文字が無視されます。 ' 行末までは無視されます。

基本的に、文字クラス内にコメントを入れることはできず、文字クラス内の空白は重要と見なされます。

は文字クラス内にあるため#、コメントとして機能せず、文字クラス内のすべてが例外なく文字クラスの一部として解析されます (改行文字も文字クラスの一部として解析されます)。n-c文字範囲が無効なため、エラーがスローされます。

式を記述する有効な方法は次のとおりです。

valid = re.compile(r'[^\uFFFE\uFFFF]   # non-characters', re.VERBOSE)

長い文字クラスを説明したい場合のコメント方法の 1 つの提案を次に示します。

r'''
# LOTS is for foo
# _ is a special fiz
# OF-LITERAL is for bar
[^LOTS_OF-LITERAL]
'''
于 2013-09-17T04:42:50.923 に答える