GREP en Python

Manav Narula 9 mai 2021
GREP en Python

GREP est une fonctionnalité de ligne de commande intéressante qui nous permet de rechercher dans des fichiers de texte brut des lignes spécifiques à l’aide d’expressions régulières.

Les expressions régulières sont très utilisées en Python et peuvent être utilisées pour vérifier si une chaîne correspond à un modèle ou non.

Le module re en Python permet de traiter les expressions régulières. Dans le code suivant, nous allons essayer d’implémenter GREP en Python et rechercher dans un fichier un modèle spécifique.

with open("sample.txt", "r") as file:
    for line in file:
        if re.search(pattern, line):
            print(line)

Nous ouvrons le fichier requis en mode lecture et parcourons le fichier ligne par ligne. Ensuite, nous utilisons la fonction re.search() pour rechercher le motif dans chaque ligne. Si le motif est trouvé, la ligne est imprimée.

Il existe une autre façon intéressante de l’implémenter dans la ligne de commande avec Python. Cette méthode spécifiera l’expression régulière et le fichier à rechercher dans la ligne de commande lors de l’exécution du fichier dans le terminal. Cela nous permet de répliquer correctement GREP en Python.

Le code suivant implémente cela.

import re
import sys

with open(sys.argv[2], "r") as file:
    for line in file:
        if re.search(sys.argv[1], line):
            print(line)

Le module sys fournit la fonction argv(), qui retourne un tableau de tous les arguments fournis dans la ligne de commande.

Nous pouvons enregistrer ce fichier sous grep.py et exécuter ce script Python depuis le terminal et spécifier les arguments nécessaires de la manière suivante.

python grep.py 'RE' 'file-name'

Si nous voulons travailler avec plusieurs arguments, alors nous pouvons utiliser le module glob.

Le module glob nous permet de trouver les chemins des fichiers qui correspondent à un motif dans un répertoire.

Son utilisation dans la réplication de GREP en Python peut être vue ci-dessous.

import re
import sys
import glob

for arg in sys.argv[2:]:
    for file in glob.iglob(arg):
        for line in open(file, "r"):
            if re.search(sys.argv[1], line):
                print(
                    line,
                )

La fonction iglob() crée un objet qui renvoie les fichiers dans le répertoire, qui est passé à la fonction.

Une autre manière concise d’implémenter GREP en quelques lignes seulement est illustrée ci-dessous.

import re
import sys

map(sys.stdout.write, (l for l in sys.stdin if re.search(sys.argv[1], l)))

Cette méthode est plus précise et plus efficace en mémoire, et nous pouvons exécuter ces lignes directement dans le terminal.

python -c "import re,sys;map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))" "RE"
Auteur: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn