GREP en Python

Manav Narula 9 mayo 2021
GREP en Python

GREP es una característica interesante de la línea de comandos que nos permite buscar líneas específicas en archivos de texto plano usando expresiones regulares.

Las expresiones regulares se usan mucho en Python y se pueden usar para verificar si una cadena coincide con un patrón o no.

El módulo re en Python nos permite tratar con expresiones regulares. En el siguiente código, intentaremos implementar GREP en Python y buscaremos en un archivo algún patrón específico.

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

Abrimos el archivo requerido en el modo de lectura e iteramos a través del archivo línea por línea. Luego usamos la función re.search() para buscar el patrón en cada línea. Si se encuentra el patrón, se imprime la línea.

Hay otra forma ingeniosa de implementar esto en la línea de comandos con Python. Este método especificará la expresión regular y el archivo que se buscará en la línea de comando mientras se ejecuta el archivo en la terminal. Esto nos permite replicar GREP en Python correctamente.

El siguiente código implementa esto.

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)

El módulo sys proporciona la función argv(), que devuelve un array de todos los argumentos proporcionados en la línea de comandos.

Podemos guardar este archivo como grep.py y ejecutar este script de Python desde la terminal y especificar los argumentos necesarios de la siguiente manera.

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

Si queremos trabajar con múltiples argumentos, entonces podemos usar el módulo glob.

El módulo glob nos permite encontrar las rutas de los archivos que coinciden con un patrón en un directorio.

Su uso para replicar GREP en Python se puede ver a continuación.

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 función iglob() crea un objeto que devuelve los archivos en el directorio, que se pasa a la función.

A continuación se muestra otra forma concisa de implementar GREP en unas pocas líneas.

import re
import sys

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

De esta manera es más precisa y eficiente en memoria, y podemos ejecutar estas líneas directamente en la terminal.

python -c "import re,sys;map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))" "RE"
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