【发布时间】:2016-07-31 23:32:28
【问题描述】:
努力掌握正则表达式,尤其是它们的match.start() 和match.end() 方法。
在玩这个代码时(找到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 和SKIP 也产生Token 输出,那么列索引就会完全混乱。
尝试使用 mo.end() 重新计算列索引以适应示例中提到的这种情况,但失败了。
任何想法、示例代码和/或解释都会很棒。
【问题讨论】:
-
如果您在docs 看到一些例子(虽然我必须说我也不太了解)。
-
谢谢,我见过他们,但并没有变得更明智,以便实施我在描述中提到的示例案例:/
-
我已经更新了令牌以匹配文档,以便您提供的代码可以正确运行:如果这是您故意遗漏的,请告诉我
标签: python regex python-3.x