2010-11-03 24 views
1

J'essaie de trouver toutes les occurrences d'une valeur flottante littérale dans le code Python. Est-ce que je peux faire ça à Komodo (ou de toute autre manière)? En d'autres termes, je veux trouver chaque ligne où quelque chose comme 0.0 ou 1.5 ou 1e5 est utilisé, en supposant qu'il est interprété par Python comme un littéral float (donc pas de commentaires, par exemple). J'utilise Komodo 6.0 avec Python 3.1.trouver tous les littéraux float dans le code Python

Si possible, un moyen de trouver des chaînes de caractères littéraux et entiers serait bien d'avoir aussi bien.

+1

Komodo a une recherche regex que vous pouvez utiliser avec un motif de recherche regex. – pyfunc

+0

Ahh, je me doutais que ça viendrait à ça ... n'est-ce pas quelque chose d'habituel? Et existe-t-il une expression regex testée pour fonctionner en Python? – max

Répondre

1

Notre SD Source Code Search Engine (SCSE) peut facilement le faire.

SCSE est un outil de recherche de bases de code source de grande taille, beaucoup plus rapide que grep, en indexant les éléments des langages de code source d'intérêt. Des requêtes peuvent alors être posées, qui utilisent l'index pour permettre une localisation rapide des résultats de recherche. Les requêtes et les hits sont affichés dans une interface graphique, et un clic sur un hit affichera le bloc de code source contenant le hit.

Le SCSE connaît la structure lexicale de chaque langage qu'il a indexé avec la précision en tant que compilateur de ce langauge. (Il utilise front ends de la famille des processeurs de langage de programmation précis, cette famille est assez grande et inclut le langage cible OP de Python/Perl/Java/...). Ainsi, il sait exactement où sont les identifiants, les commentaires et les littéraux (intégrale, flottante, caractère ou chaîne), et exactement leur contenu.

Les requêtes SCSE sont composées de commandes représentant des séquences d'éléments de langage d'intérêt. La requête

'for' ... I '=' N=103 

trouve un pour mot-clé près ("... ") un identifiant arbitraire (I) qui est initialisé ("= ") avec la valeur numérique (" N") de 103. En raison SCSE comprend la structure de la langue, il ignore les espaces-langues entre les jetons, par exemple, il peut trouver ceci indépendamment des espaces vides, des espaces, des retours à la ligne ou des commentaires. Les jetons de requête I, N, F, S, C représentent I (identifiant), Natural (nombre), F (drapé), S (tring) et C (omment) respectivement. La question initiale de l'OP, de trouver tous les flotteurs, est donc la presque triviale requête

F 

De même pour trouver toutes les littéraux de chaîne (« S ») et littéraux intégrale (« N »).Si vous voulez trouver seulement des copies des valeurs proches de Pi, vous souhaitez ajouter des contraintes liées faible et supérieur:

F>3.14<3.16 

(Il est assez drôle de l'exécuter sur les grands codes Fortran, vous voyez toutes sortes de mauvaises approximations de Pi).

SCSE ne trouve pas de flottant dans un commentaire ou une chaîne, car il connaît intimement la différence. Écrire une expression de type grep pour gérer toutes les combinaisons étranges afin d'éliminer les espaces ou les citations et les délimiteurs qui vous entourent devrait être évidemment beaucoup plus douloureux. Grep n'est pas le moyen de le faire.

1

Vous pouvez le faire en sélectionnant ce dont vous avez besoin avec des expressions régulières.

Cette commande (exécuter sur un terminal) devrait faire l'affaire:

sed -r "s/^([^#]*)#.*$/\1/g" YOUR_FILE | grep -P "[^'\"\w]-?[1-9]\d*[.e]\d*[^'\"\w]" 

Vous aurez probablement besoin de ruser pour obtenir un meilleur résultat.

`sed » coupures sur les commentaires, alors que grep lignes ne contenant que sélectionne (une petite subsect de - l'expression que j'ai donné n'est pas parfait) valeurs flottantes ...

Hope it helps.

+0

Merci ... Bien sûr, ce n'est pas pareil que d'avoir Komodo déplacer automatiquement le curseur sur chaque ligne où il est utilisé, mais c'est mieux que rien ... – max

+0

+1 pour l'exemple de regex au cas où je devrais l'utiliser . – max