Comment puis-je découper une chaîne en jetons?

Si j'ai une chaîne

'x+13.5*10x-4e1'

comment puis-je diviser dans la liste suivante des jetons?

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

Actuellement, je suis en utilisant le shlex module:

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

Mais cela renvoie:

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

Donc, je suis en train de séparer les lettres des nombres. Je suis d'envisager de prendre les chaînes qui contiennent à la fois des lettres et des chiffres alors en quelque sorte de les diviser, mais ne savez pas comment faire ou comment ajouter tous de retour dans la liste avec les autres par la suite. Il est important que les jetons de rester dans l'ordre, et je ne peux pas avoir des listes imbriquées.

Dans un monde idéal, e et E ne seront pas reconnues comme des lettres de la même manière, de sorte

'-4e1'

deviendrait

['-', '4e1']

mais

'-4x1'

deviendrait

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

Quelqu'un peut-il aider?

quid des nombres négatifs?
En effet, la shlex module n'est pas le meilleur choix ici; c'est un shell-syntaxe de l'analyseur lexical et l'analyseur, pas une expression mathématique de l'analyseur.
le - est vu comme un opérateur unaire ici, résultant dans les nombres négatifs.
Connexes: de Mathématiques de l'Évaluation de l'Expression
Par curiosité, pourquoi les deux explicite * et implicites de la multiplication (10x est 10*x vraiment)? Qui rend l'analyse un tout petit peu plus difficile d'avoir à ramasser ces trop.

OriginalL'auteur Martin Thetford | 2013-08-19