Python - Comment scinder une chaîne de caractères non alpha
Je suis en train d'utiliser python pour analyser les lignes de code source c++. La seule chose qui m'intéresse, c'est d'inclure les directives.
#include "header.hpp"
Je veux qu'il soit flexible et toujours travailler avec un mauvais codage des styles comme:
# include"header.hpp"
J'ai obtenu au point où je peux lire des lignes et de l'assiette d'espace avant et après le symbole #. Cependant j'ai encore besoin de savoir ce que la directive c'est par la lecture de la chaîne jusqu'à ce qu'un non-alpha personnage est rencontré, peu importe la météo, c'est un espace, devis, onglet ou en angle support.
Donc en gros ma question est: Comment puis-je diviser une chaîne commençant avec les alphas jusqu'à ce qu'un non alpha est rencontré?
Je pense que je pourrais être capable de le faire avec les regex, mais je n'ai rien trouvé dans la documentation qui ressemble à ce que je veux.
Aussi si quelqu'un a des conseils sur comment je pourrais obtenir le nom de fichier entre guillemets ou entre crochets que serait un plus.
Inclure un exemple de chaîne et le résultat attendu s'il vous plaît.
si la directive n'est rien d'autre ensuite inclure ce n'est pas grave et je vais passer à la ligne suivante, mais si c'est une directive include, j'aurai besoin de l'en-tête.hpp".
exemple de texte: "#include "header.hpp"" souhaité la sortie si la directive est de citer: "en-tête.hpp" (ou "en"en-tête.hpp"")
Plaine python, ou de bibliothèques sont des suggestions de permis?
OriginalL'auteur nickeb96 | 2016-02-05
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire avec une regex. Cependant, vous pouvez également utiliser un simple
while
boucle.Test:
Je vous recommande de trouver un réel C de l'analyseur. Ce (la pire) comme avec tous les autres réponses ne peuvent pas s'en approcher.
Je vais probablement regarder C analyseurs plus tard, mais depuis que j'ai vraiment besoin que de chercher à inclure les directives pour l'instant, je a été de saut pour une solution légère. Je suis fondamentalement, il suffit de faire un simple générateur de makefile comme bakefile ou d'innombrables autres
Un générateur qui doit être vérifié à la main pour plus de précision, n'est d'aucune utilité.
Le point de l'ensemble dans l'analyse tous les fichiers de la source est donc il n'a pas à être vérifié à la main.
OriginalL'auteur kfx
Votre instinct sur l'utilisation de regex est correct.
La
[^a-zA-Z]
partie signifie "pas de caractères alphabétiques".Il divise l'espace pour moi. Il me semble qu'il serait divisé sur quoi que ce soit à l'exception des caractères alphanumériques. Il n'exclut a-z et A-Z - donc, c'est une série très limitée.
OriginalL'auteur nlloyd
Les deux options mentionnées par d'autres qui sont meilleurs à mon avis, sont
re.split
etre.findall
:Un rapide benchmark:
De la différence fonctionnelle, c'est que
re.split
conserve vide jetons. Ce n'est généralement pas utile pour la segmentation des fins, mais les points suivants doivent être identiques à lare.findall
solution:OriginalL'auteur Denis Drescher
Vous pouvez utiliser les regex. Le
\W
jeton correspond à tous les non-caractères de mot (qui est environ la même que la non-alphanumériques). Les caractères de mot sontA-Z
,a-z
,0-9
, et_
. Si vous souhaitez faire correspondre souligne ainsi, vous pourriez faire[\W_]
.La plupart C des analyseurs ne permettent pas de saut de ligne entre les
#
etinclude
où cette*#\s*include
ne le permettrait.OriginalL'auteur Patrick Carroll
de sortie : ['foo', 'bar', 'bla', 'hm', 'lala']
OriginalL'auteur Daniyal Syed
Tout n'est pas exacte, la plupart analyser l'en-tête directives comme ce
(?m)^\h*#\h*include\h*["<](\w[\w.]*)\h*[">]
Où, (?m) est le mode multi-lignes, \h est blanc horizontal (aka [^\S\r\n] ).
OriginalL'auteur sln
Cela fonctionne:
remplacer dans l'expression régulière ou à la chaîne d'entrée? pourquoi ne pas juste pour voir si une correspondance est trouvée en première...
la chaîne d'entrée.
ah, il travaille désormais avec l'instruction if. Si seulement un débordement de pile permettez-moi de l'accepter 2 réponses.
OriginalL'auteur Garrett R
importation re
re.split('[^a-zA-Z0-9]', string_to_split)
pour tous !(alphanumaric) caractères
OriginalL'auteur user2902302