Как я могу разделить строку на токены?

если у меня есть строка

'x+13.5*10x-4e1'

как я могу разделить его на следующий список токенов?

['x', '+', '13', '.', '5', '*', '10', 'x', '-', '4', 'e', '1']

в настоящее время я использую модуль shlex:

str = 'x+13.5*10x-4e1'
lexer = shlex.shlex(str)
tokenList = []
for token in lexer:
    tokenList.append(str(token))
return tokenList

но это возвращает:

['x', '+', '13', '.', '5', '*', '10x', '-', '4e1']

поэтому я пытаюсь разделить буквы от чисел. Я рассматриваю возможность взять строки, содержащие как буквы, так и цифры, а затем каким-то образом разделить их, но не уверен, как это сделать или как добавить их все обратно в список с другими впоследствии. Важно, чтобы маркеры оставались в порядке, и у меня не может быть вложенных списков.

в идеальном мире e и E не были бы признаны буквами одинаково, поэтому

'-4e1'

станет

['-', '4e1']

но

'-4x1'

станет

['-', '4', 'x', '1']

может кто-нибудь помочь?

3 ответов


используйте модуль регулярного выражения


другая альтернатива, не предложенная здесь, заключается в использовании в nltk.tokenize модуль


ну, проблема, кажется, не совсем проста. Я думаю, хороший способ получить надежное (но, к сожалению, не такое короткое) решение-использовать Python Lex-Yacc для создания полноразмерного токенизатора. Lex-Yacc является общей (не только Python) практикой для этого, поэтому могут существовать готовые грамматики для создания простого арифметического токенизатора (как это), и вы должны просто соответствовать им вашим конкретным потребностям.