expresiones regulares u otra forma de obtener datos de una línea con entrada variable

en python, estoy tratando de obtener datos de una línea. Las líneas parecen:

1. cpasite=5 nsubl=4 cpatypes=3,4,5,6 2. cpasite=6 nsubl=2 cpatypes=7,8 3. cpasite=7 nsubl=4 cpatypes=9,10 4. cpasite=8 nsubl=2 cpatypes=11,12 5. cpasite=9 nsubl=6 cpatypes=13,14,15,16,17,18 

Lo he expresado de la siguiente manera:

 pattern=r'(\d+)\. \s* cpasite=(.*)\s* nsubl=(.*)\s* cpatypes=(.*)' 

El problema es que necesito esos sitios (por ejemplo, 3,4,5,6) por separado, para poder usarlos para mi propósito. pero dado que el número no es fijo, no puedo dividirlo (que yo sepa).

¿Cómo puedo usar esos cpasites?

¿Por qué no usar su regex y luego tomar el cuarto grupo capturado que será como: ‘3,4,5,6’

Luego puede dividir esa cadena para obtener su lista de valores con los que puede trabajar por separado:

 s = '3,4,5,6' s = map(int, s.split(',')) print s [3,4,5,6] >>> print s[2] 5 

Split es tu amigo Menos regex == menos complejidad.

 s = '1. cpasite=5 nsubl=4 cpatypes=3,4,5,6' sites = s.split('=')[-1] sites = sites.split(',') 

Debería ser:

  pattern=r'(\d+)\. \s* cpasite=(.*)\s* nsubl=(.*)\s* cpatypes=(\d+)(?:,(\d+))*' 

Sin embargo, por alguna razón parece que

 (\d+)(?:,(\d+))* 

solo captura los primeros cpatypes y el último … Me parece un error del módulo de re .

Da la vuelta:

Sin embargo, si conoce el número máximo de cpatypes que puede tener, entonces

 pattern=r'(\d+)\. \s* cpasite=(.*)\s* nsubl=(.*)\s* cpatypes=(\d+)(?:,(\d+))?(?:,(\d+))?' 

repitiendo

 (?:,(\d+))? 

tantas veces como sea necesario (el máximo de los tipos de patología esperados), funcionó para mí . Aun así es un poco feo …