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.

Python: Verificar si las cadenas en una lista cumplen condiciones muy específicas.

Tengo una lista de nombres de archivo similares a esta (pero muy larga):

list = ['AB8372943.txt', 'test.pdf', '123485940.docx', 'CW2839502.txt', 'AB1234567.txt', '283AB.txt']

Estoy buscando crear otra lista a partir de esta tomando solo las cadenas que cumplan 4 condiciones:

  1. Comenzar con la subcadena “AB”
  2. Terminar con la subcadena “.txt”
  3. Entre “AB” y “.txt” debe haber un número de 7 dígitos
  4. No debe haber otras subcadenas en la cadena (es decir, solo pueden estar los 3 elementos anteriores en la cadena)

Por lo tanto, en este caso, el resultado deseado sería esta lista:

list2 = ['AB8372943.txt', 'AB1234567.txt']

Hasta ahora sé que para buscar un número de 7 dígitos puedo usar:

list2 = [i for i in list if re.findall(r"\d{7}", i)]

Y cómo buscar subcadenas dentro de las cadenas … Pero no es suficiente que las cadenas solo contengan las subcadenas, ¡necesitan comenzar y terminar con una específica y tener un número de 7 dígitos en el medio y eso es todo! ¿Hay alguna manera de hacer esto?

¡Gracias de antemano!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para encontrar cadenas que cumplan las cuatro condiciones, puedes utilizar la función re.findall y combinar expresiones regulares para cada condición usando afirmaciones lookahead y lookbehind:

    import re
    
    lista = ['AB8372943.txt', 'test.pdf', '123485940.docx', 'CW2839502.txt', 'AB1234567.txt', '283AB.txt']
    
    lista2 = [i for i in lista if re.findall(r'^(?=.*AB)(?=.*\d{7})(?=^AB.*\.txt$)^[AB\d]{10}\.txt$', i)]
    
    print(lista2)
    

    Explicación de la expresión regular:

    • ^ asegura la posición al principio de la cadena
    • (?=.*AB) afirmación lookahead: asegura que la cadena contiene “AB” en cualquier lugar
    • (?=.*\d{7}) afirmación lookahead: asegura que la cadena contiene un número de 7 dígitos en cualquier lugar
    • (?=^AB.*\.txt$) afirmación lookahead: asegura que la cadena comienza con “AB” y termina con “.txt”
    • ^[AB\d]{10}\.txt$ coincide con toda la cadena: comenzando con “AB” o un dígito, seguido de 7 dígitos y terminando con “.txt”

    Este patrón coincide exactamente con las cadenas que contienen “AB”, un número de 7 dígitos y terminan con “.txt”, sin otros caracteres intermedios. Excluye las cadenas que contienen “AB” o un número de 7 dígitos pero que no siguen el formato dado.

Comments are closed.