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?
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
Vous devez vous connecter pour publier un commentaire.
Utiliser l'expression régulière du module
split()
fonction, de le couper à'\d+'
-- chiffres (nombre de caractères) et'\W+'
-- non-caractères de mot:CODE:
De SORTIE:
Si vous ne souhaitez pas séparer le point (comme un nombre à virgule flottante dans l'expression), vous devez alors utiliser ceci:
[\d.]+
-- un chiffre ou d'un point de caractères (même si cela permet d'écrire:13.5.5
CODE:
De SORTIE:
13.5
est déchiré en parties distinctes trop; cela peut faire avec un peu de raffinage. 😛mais c'est exactement ce que l'OP a été à la recherche pour les!
Je soupçonne l'OP raté que le nombre à virgule flottante a été divisé trop, en fait.
J'ai été à la recherche pour elle, mais à long terme, il est effectivement plus facile avec elle collées ensemble. Étant nouveau pour la programmation je viens de prendre ce que j'avais de shlex et en utilisant une autre fonction à coller les décimales de retour ensemble. Ainsi, bien qu'il sera nécessaire de changer ça va être plus simple. Merci!
OriginalL'auteur Peter Varo
Une autre alternative n'est pas suggéré ici, est à l'aide de nltk.marquer module
OriginalL'auteur redrubia
Bien, le problème ne semble pas être tout à fait simple. Je pense, un bon moyen d'obtenir robuste (mais, malheureusement, pas si court) la solution est d'utiliser Python Lex-Yacc pour la création d'un poids tokenizer. Lex-Yacc est une commune de la (non seulement Python) pratique pour ceci, par conséquent, il n'existe pas prêt de grammaires pour la création d'une arithmétique simple générateur de jetons (comme celui-ci), et vous avez juste à les adapter à vos besoins spécifiques.
OriginalL'auteur Tigran Saluev