es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Corresponde al documento “Emparejar múltiples patrones en múltiples archivos”

Me gustaría encontrar/comprobar múltiples patrones patrón1, patrón2, … en múltiples archivos con la misma extensión, digamos *.ext, de tal manera que si uno de los patrones no se encuentra en todos los archivos, devuelve falso.
Ejemplo:

archivo1.ext

este archivo tiene patrón1
con muchas otras líneas

archivo2.ext

este archivo tiene patrón2
con muchas otras líneas

En este caso, dado que tanto el patrón1 como el patrón2 están presentes (aunque en diferentes archivos), debería devolver true. Es decir, todos los patrones deben estar presentes en todos los archivos.

Una forma de hacer esto es buscar cada patrón individualmente en todos los archivos usando grep y comprobar si cada grep devuelve al menos 1 coincidencia.
grep -R 'patrón1' --include="*.ext"
grep -R 'patrón2' --include="*.ext"

Pero esto será costoso ya que puede haber una gran cantidad de archivos y varios patrones para buscar.
Otra forma es hacer grep para todos los patrones con | y analizar la salida para comprobar si se encontraron todos los patrones.
grep -oR 'patrón1\|patrón2' --include="*.ext"

Salida:

archivo2.ext:patrón2
archivo1.ext:patrón1

PD: Buscar patrones en archivos es uno de los requisitos para un script de Python que estoy escribiendo.

EDICIÓN: Algunos detalles sobre lo que se entiende por patrón aquí.
El patrón es una cadena. Puede contener caracteres especiales.
El match debe ocurrir incluso si el patrón es una subcadena en una línea. Un mejor ejemplo de cómo se ve un patrón:

Archivo:

move-result-object v0
invoke-virtual {v0, v2}, Landroid/content/Intent;->hasExtra(Ljava/lang/String;)Z
move-result v3
const/4 v4, 0x0
if-nez v3, :cond_0

Patrón:

Landroid/content/Intent;->hasExtra

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para encontrar/comprobar múltiples patrones en múltiples archivos con la misma extensión usando Python, podemos utilizar el módulo glob para obtener una lista de todos los archivos con la extensión especificada, y luego utilizar el módulo re para buscar cada patrón en cada archivo. Podemos combinar los patrones usando el operador | en una expresión regular.

    Aquí hay un ejemplo de código:

    import glob
    import re
    
    # lista de patrones a buscar
    patrones = ['patrón1', 'patrón2', 'patrón3']
    
    # extensión de archivos para buscar
    ext = '*.ext'
    
    # obtener una lista de todos los archivos con la extensión especificada
    archivos = glob.glob(ext)
    
    # recorrer todos los archivos y buscar cada patrón
    for patron in patrones:
        se_encontro_todo = True  # asumir que todos los archivos contienen el patrón inicialmente
        for archivo in archivos:
            with open(archivo, 'r') as f:
                contenido = f.read()
                if not re.search(patron, contenido):
                    se_encontro_todo = False  # establecer la bandera en False si no se encontró el patrón
                    break  # no es necesario buscar en los archivos restantes
        if not se_encontro_todo:
            print(f"{patron} no se encontró en todos los archivos")
            # hacer algo, por ejemplo, salir del script
    

    En el código anterior, primero definimos una lista de patrones a buscar (patrones) y la extensión de archivos para buscar (ext). Luego usamos la función glob.glob() para obtener una lista de todos los archivos con la extensión ext.

    A continuación, recorremos todos los patrones, y para cada patrón recorremos todos los archivos y buscamos el patrón utilizando la función re.search(). Si no se encuentra el patrón en un archivo, establecemos la bandera se_encontro_todo en False y salimos inmediatamente del bucle interno, ya que solo necesitamos encontrar un archivo donde falte el patrón.

    Si al final del bucle interno la bandera se_encontro_todo sigue siendo verdadera, pasamos al siguiente patrón. Sin embargo, si la bandera es falsa, imprimimos un mensaje indicando que no se encontró el patrón en todos los archivos, y opcionalmente hacemos algo más, por ejemplo, salir del script.

    Tenga en cuenta que el código anterior asume que cada patrón es una expresión regular. Si los patrones son cadenas simples que pueden contener caracteres especiales, deberemos escapar estos caracteres antes de utilizarlos en la expresión regular. Podemos utilizar la función re.escape() para ello. Por ejemplo:

    patron = re.escape('Landroid/content/Intent;->hasExtra')
    

Comments are closed.