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:
- Comenzar con la subcadena “AB”
- Terminar con la subcadena “.txt”
- Entre “AB” y “.txt” debe haber un número de 7 dígitos
- 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!
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: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.