Je travaille sur un projet qui me demande d'extraire le nom et l'emplacement d'un package Python installé à l'aide de la commande pip install
.
Une page Web contient un élément code
qui contient plusieurs lignes de texte et des commandes bash. Je souhaite écrire un code JS capable d'analyser ce texte et de trouver les packages et leur emplacement dans le texte.
Par exemple, si le texte est :
$ pip install numpy pip install --global-option build_ext -t ../ pandas>=1.0.0,<2 sudo apt update pip uninstall numpy pip install "requests==12.2.2"
Je veux obtenir des résultats comme celui-ci :
[ { "name": "numpy", "position": 14 }, { "name": "pandas", "position": 65 }, { "name": "requests", "position": 131 } ]
Comment puis-je implémenter cette fonctionnalité en JavaScript ?
Vous pouvez voir le code que j'ai expliqué dans cette réponse.
Voici une autre solution similaire, davantage basée sur les expressions régulières :
Voici une solution alternative, essayez d'utiliser une boucle au lieu d'une expression régulière :
L'idée est de retrouver des lignes contenant
pip install
du texte, ce sont ces lignes qui nous intéressent. Ensuite, divisez la commande en mots et parcourez-les jusqu'à ce que vous atteigniez la partie package de la commande.Tout d’abord, nous allons définir une expression régulière pour le package. N'oubliez pas qu'un colis peut ressembler à quelque chose comme
pip install 'stevedore>=1.3.0,<1.4.0' "MySQL_python==1.2.2"
:Remarquez le groupement nommé ,
package_part
用于识别“带版本的包”字符串,而package_name
utilisé pour extraire le nom du package.À propos des paramètres
Nous avons deux types d'arguments de ligne de commande : options et flags.
Le problème avecoptions est que nous devons comprendre que le mot suivant n'est pas le nom du package, mais la valeur options.
Donc, j'ai d'abord listé toutes les options dans la commande
pip install
:J'ai ensuite écrit une fonction que j'utiliserai plus tard pour décider quoi faire lorsqu'elle voit un argument :
Cette fonction reçoit les paramètres reconnus et le reste de la commande, découpés en mots.
(Ici, vous commencez à voir le « compteur d'index ». Puisque nous devons également trouver la position de chaque découverte, nous devons garder une trace de la position actuelle dans le texte original).
Dans les dernières lignes de la fonction, vous pouvez voir que je gère
--option=something
和--option something
les deux cas.Parseur
L'analyseur principal divise désormais le texte brut en lignes puis en mots.
Chaque opération doit mettre à jour l'index global pour savoir où nous en sommes dans le texte, et cet index nous aide à rechercher et trouver dans le texte sans rester coincé dans la mauvaise sous-chaîne, en utilisant
indexOf(str, counterIndex)
: