Extraer subcadena de nombre de archivo en Python?

Tengo un directorio lleno de archivos que tienen cadenas de fecha como parte de los nombres de archivo:

file_type_1_20140722_foo.txt file_type_two_20140723_bar.txt filetypethree20140724qux.txt 

Necesito obtener estas cadenas de fecha de los nombres de archivo y guardarlas en una matriz:

 ['20140722', '20140723', '20140724'] 

Pero pueden aparecer en varios lugares en el nombre del archivo, por lo que no puedo usar la notación de subcadenas y extraerla directamente. En el pasado, la forma en que he hecho algo similar a esto en Bash es así:

 date=$(echo $file | egrep -o '[[:digit:]]{8}' | head -n1) 

Pero no puedo usar Bash para esto porque apesta en matemáticas (necesito poder sumr y restar números de punto flotante). He intentado glob.glob() y re.match() , pero ambos devuelven conjuntos vacíos:

 >>> dates = [file for file in sorted(os.listdir('.')) if re.match("[0-9]{8}", file)] >>> print dates >>> [] 

Sé que el problema es que busca nombres completos de archivos que tengan ocho dígitos, pero no tengo idea de cómo hacer que busquen subcadenas. ¿Algunas ideas?

 >>> import re >>> import os >>> [date for file in os.listdir('.') for date in re.findall("(\d{8})", file)] ['20140722', '20140723'] 

Tenga en cuenta que si un nombre de archivo tiene una subcadena de 9 dígitos, solo coincidirán los primeros 8 dígitos. Si un nombre de archivo contiene una subcadena de 16 dígitos, habrá 2 coincidencias no superpuestas.

re.match coincide desde el principio de la cadena. re.search coincide con el patrón en cualquier lugar. O puedes probar esto:

 extract_dates = re.compile("[0-9]{8}").findall dates = [dates[0] for dates in sorted( extract_dates(filename) for filename in os.listdir('.')) if dates] 

Tu expresión regular se ve bien, pero deberías usar re.search en lugar de re.match para que busque esa expresión en cualquier parte de la cadena:

 import re r = re.compile("[0-9]{8}") m = r.search(filename) if m: print m.group(0)