Это оптимизированная версия токенизатора, которая была впервые написана, и работает довольно хорошо. Вторичный токенизатор может анализировать выходные данные этой функции для создания классифицированных токенов большей специфичности.Как переписать простой токенизатор для использования регулярных выражений?
def tokenize(source):
return (token for token in (token.strip() for line
in source.replace('\r\n', '\n').replace('\r', '\n').split('\n')
for token in line.split('#', 1)[0].split(';')) if token)
Мой вопрос заключается в следующем: , как это может быть написано просто с re
модулем? Ниже приведена моя неэффективная попытка.
def tokenize2(string):
search = re.compile(r'^(.+?)(?:;(.+?))*?(?:#.+)?$', re.MULTILINE)
for match in search.finditer(string):
for item in match.groups():
yield item
Edit: Это тип вывода, что я ищу с Tokenizer. Разбор текста должен быть простым.
>>> def tokenize(source):
return (token for token in (token.strip() for line
in source.replace('\r\n', '\n').replace('\r', '\n').split('\n')
for token in line.split('#', 1)[0].split(';')) if token)
>>> for token in tokenize('''\
a = 1 + 2; b = a - 3 # create zero in b
c = b * 4; d = 5/C# trigger div error
e = (6 + 7) * 8
# try a boolean operation
f = 0 and 1 or 2
a; b; c; e; f'''):
print(repr(token))
'a = 1 + 2'
'b = a - 3 '
'c = b * 4'
'd = 5/c '
'e = (6 + 7) * 8'
'f = 0 and 1 or 2'
'a'
'b'
'c'
'e'
'f'
>>>
будет применять матч регулярного выражения к 'if' заявлению в конце вашего генератора понимания сделать это? – tMC
Нет, одна из проблем заключается в том, что выражение типа 'a; b; c' возвращает '(' a ',' c ')' и 'a # b' возвращает' (' a ', None) '. –