の正規表現、特にそのmatch.start()
とmatch.end()
の方法をよく理解するために苦労しています。このコードで遊んでいる間正規表現match.start()とmatch.end()Pythonの例
は(hereを見つけた):
Token = collections.namedtuple('Token', ['typ', 'value', 'line', 'column'])
def tokenize(code):
keywords = {'IF', 'THEN', 'ENDIF', 'FOR', 'NEXT', 'GOSUB', 'RETURN'}
token_specification = [
('NUMBER', r'\d+(\.\d*)?'), # Integer or decimal number
('ASSIGN', r':='), # Assignment operator
('END', r';'), # Statement terminator
('ID', r'[A-Za-z]+'), # Identifiers
('OP', r'[+\-*/]'), # Arithmetic operators
('NEWLINE', r'\n'), # Line endings
('SKIP', r'[ \t]+'), # Skip over spaces and tabs
('MISMATCH',r'.'), # Any other character
]
tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification)
line_num = 1
line_start = 0
for mo in re.finditer(tok_regex, code):
kind = mo.lastgroup
value = mo.group(kind)
if kind == 'NEWLINE':
line_start = mo.end()
line_num += 1
elif kind == 'SKIP':
pass
elif kind == 'MISMATCH':
raise RuntimeError('%r unexpected on line %d' % (value, line_num))
else:
if kind == 'ID' and value in keywords:
kind = value
column = mo.start() - line_start
yield Token(kind, value, line_num, column)
statements = '''
IF quantity THEN
total := total + price * quantity;
tax := price * 0.05;
ENDIF;
'''
for token in tokenize(statements):
print(token)
mo.end()
とmo.start()
を使用して行と列を計算するときに、私が使用してロジックを理解することはできません。 たとえばの場合、NEWLINE
とを出力するとToken
の出力も得られる場合は、列のインデックスが完全に崩れてしまいます。 mo.end()
で列のインデックスを再計算して、この例のようにこのケースに対応しましたが、失敗しました。 アイデア、サンプルコード、説明が素晴らしいです。
あなたは[ドキュメント]に表示された場合(https://docs.python.org/3/library/ re.html#re.match.start)いくつかの例があります(私はどちらもあまり理解していません)。 – Karim
ありがとう、私はそれらを見たが、説明に言及するその事例を実装するために賢明になりませんでした:/ –
私はあなたが提供したコードが正しく動作するようにドキュメントに一致するようにトークンを更新しました:それがあなたの部分の意図的な省略であるかどうか私に知らせてください。 –