Python – regex – División de la cadena antes de la palabra

Estoy tratando de dividir una cadena en python antes de una palabra específica. Por ejemplo, me gustaría dividir la siguiente cadena antes de "path:" .

  • dividir cadena antes de "path:"
  • entrada: "path:bte00250 Alanine, aspartate and glutamate metabolism path:bte00330 Arginine and proline metabolism"
  • salida: ['path:bte00250 Alanine, aspartate and glutamate metabolism', 'path:bte00330 Arginine and proline metabolism']

Yo he tratado

 rx = re.compile("(:?[^:]+)") rx.findall(line) 

Esto no divide la cadena en ninguna parte. El problema es que los valores después de "path:" nunca se sabrán que especifiquen la palabra completa. ¿Alguien sabe como hacer esto?

el uso de una expresión regular para dividir la cadena parece un poco excesivo: el método de la cadena split() puede ser justo lo que necesita.

de todos modos, si realmente necesitas hacer coincidir una expresión regular para dividir tu cadena, debes usar el método re.split() , que divide una cadena en una coincidencia de expresión regular.

También, use una expresión regular correcta para dividir:

 >>> line = 'path:bte00250 Alanine, aspartate and glutamate metabolism path:bte00330 Arginine and proline metabolism' >>> re.split(' (?=path:)', line) ['path:bte00250 Alanine, aspartate and glutamate metabolism', 'path:bte00330 Arginine and proline metabolism'] 

El grupo (?=...) es una afirmación de búsqueda anticipada: la expresión coincide con un espacio (tenga en cuenta el espacio al comienzo de la expresión), seguida de la cadena 'path:' , sin consumir lo que sigue al espacio.

Podría hacer ["path:"+s for s in line.split("path:")[1:]] lugar de usar una expresión regular. (tenga en cuenta que omitimos la primera coincidencia, que no tiene el prefijo “ruta:”).

 in_str = "ruta: bte00250 Alanina, aspartato y metabolismo del glutamato ruta: bte00330 Arginina y metabolismo de la prolina"
 in_list = in_str.split ('ruta:')
 imprimir ", ruta:". join (in_list) [1:]

Esto se puede hacer sin expresiones regulares. Dada una cadena:

 s = "path:bte00250 Alanine, aspartate ... path:bte00330 Arginine and ..." 

Podemos reemplazar temporalmente la palabra deseada con un marcador de posición. El marcador de posición es un carácter único, que usamos para dividir por:

 word, placeholder = "path:", "|" s = s.replace(word, placeholder).split(placeholder) s # ['', 'bte00250 Alanine, aspartate ... ', 'bte00330 Arginine and ...'] 

Ahora que la cadena está dividida, podemos unir la palabra original a cada subcadena utilizando una lista de comprensión:

 ["".join([word, i]) for i in s if i] # ['path:bte00250 Alanine, aspartate ... ', 'path:bte00330 Arginine and ...']