Extraiga las subcadenas por separado de una cadena usando expresiones regulares de python

Estoy intentando escribir una expresión regular que devuelve una parte de la subcadena que está después de una cadena. Por ejemplo: quiero obtener parte de la subcadena junto con los espacios que residen después del “15/08/2017”.

a='''S LINC SHORT LEGAL TITLE NUMBER 0037 471 661 1720278;16;21 172 211 342 LEGAL DESCRIPTION PLAN 1720278 BLOCK 16 LOT 21 EXCEPTING THEREOUT ALL MINES AND MINERALS ESTATE: FEE SIMPLE ATS REFERENCE: 4;24;54;2;SW MUNICIPALITY: CITY OF EDMONTON REFERENCE NUMBER: 172 023 641 +71 ---------------------------------------------------------------------------- ---- REGISTERED OWNER(S) REGISTRATION DATE(DMY) DOCUMENT TYPE VALUE CONSIDERATION --------------------------------------------------------------------------- -- --- 172 211 342 15/08/2017 AFFIDAVIT OF CASH & MTGE''' 

¿Hay alguna manera de obtener 'AFFIDAVIT OF' y 'CASH & MTGE' como cadenas separadas?

Aquí está la expresión que he juntado hasta ahora:

 doc = (a.split('15/08/2017', 1)[1]).strip() 'AFFIDAVIT OF CASH & MTGE' 

No es una solución basada en expresiones regulares. Pero hace el truco.

 a='''S LINC SHORT LEGAL TITLE NUMBER 0037 471 661 1720278;16;21 172 211 342 LEGAL DESCRIPTION PLAN 1720278 BLOCK 16 LOT 21 EXCEPTING THEREOUT ALL MINES AND MINERALS ESTATE: FEE SIMPLE ATS REFERENCE: 4;24;54;2;SW MUNICIPALITY: CITY OF EDMONTON REFERENCE NUMBER: 172 023 641 +71 ---------------------------------------------------------------------------- ---- REGISTERED OWNER(S) REGISTRATION DATE(DMY) DOCUMENT TYPE VALUE CONSIDERATION --------------------------------------------------------------------------- -- --- 172 211 342 15/08/2017 AFFIDAVIT OF CASH & MTGE''' doc = (a.split('15/08/2017', 1)[1]).strip() # used split with two white spaces instead of one to get the desired result print(doc.split(" ")[0].strip()) # outputs AFFIDAVIT OF print(doc.split(" ")[-1].strip()) # outputs CASH & MTGE 

Espero eso ayude.

fragmento de código basado en re

 import re foo = '''S LINC SHORT LEGAL TITLE NUMBER 0037 471 661 1720278;16;21 172 211 342 LEGAL DESCRIPTION PLAN 1720278 BLOCK 16 LOT 21 EXCEPTING THEREOUT ALL MINES AND MINERALS ESTATE: FEE SIMPLE ATS REFERENCE: 4;24;54;2;SW MUNICIPALITY: CITY OF EDMONTON REFERENCE NUMBER: 172 023 641 +71 ---------------------------------------------------------------------------- ---- REGISTERED OWNER(S) REGISTRATION DATE(DMY) DOCUMENT TYPE VALUE CONSIDERATION --------------------------------------------------------------------------- -- --- 172 211 342 15/08/2017 AFFIDAVIT OF CASH & MTGE''' pattern = '.*\d{2}/\d{2}/\d{4}\s+(\w+\s+\w+)\s+(\w+\s+.*\s+\w+)' result = re.findall(pattern, foo, re.MULTILINE) print "1st match: ", result[0][0] print "2nd match: ", result[0][1] 

Salida

 1st match: AFFIDAVIT OF 2nd match: CASH & MTGE 

Podemos intentar usar re.findall con el siguiente patrón:

 PHASED OF ((?!\bCONDOMINIUM PLAN).)*)(?=CONDOMINIUM PLAN) 

Al buscar en modo multilínea y DOTAL, el patrón anterior coincidirá con todo lo que ocurre entre PHASED OF hasta, pero sin incluir, CONDOMINIUM PLAN .

 input = "182 246 612 01/10/2018 PHASED OF CASH & MTGE\n CONDOMINIUM PLAN" result = re.findall(r'PHASED OF (((?!\bCONDOMINIUM PLAN).)*)(?=CONDOMINIUM PLAN)', input, re.DOTALL|re.MULTILINE) output = result[0][0].strip() print(output) CASH & MTGE 

Tenga en cuenta que también elimino los espacios en blanco del partido. Podríamos modificar el patrón de expresiones regulares para hacer esto, pero en una solución general, tal vez quiera mantener algo de espacio en blanco, en ciertos casos.

¿Por qué las expresiones regulares?

Parece que conoces la cadena de delimitación exacta, solo str.split() y obtén la primera parte:

 In [1]: a='172 211 342 15/08/2017 TRANSFER OF LAND $610,000 CASH & MTGE' In [2]: a.split("15/08/2017", 1)[0] Out[2]: '172 211 342 ' 

Evitaría usar expresiones regulares aquí, porque la única separación significativa entre los términos lógicos parece ser 2 o más espacios. Los términos individuales, incluido el que desea hacer coincidir, también pueden tener espacios. Por lo tanto, recomiendo hacer una división de expresiones regulares en la entrada usando \s{2,} como patrón. Estos darán una lista que contiene todos los términos. Luego, solo podemos caminar por la lista una vez, y cuando encontremos el término con visión de futuro, podemos devolver el término anterior en la lista.

 import re a = "172 211 342 15/08/2017 TRANSFER OF LAND $610,000 CASH & MTGE" parts = re.compile("\s{2,}").split(a) print(parts) for i in range(1, len(parts)): if (parts[i] == "15/08/2017"): print(parts[i-1]) ['172 211 342', '15/08/2017', 'TRANSFER OF LAND', '$610,000', 'CASH & MTGE'] 172 211 342 

Mirada positiva detrás de la afirmación * *

  m=re.search('(?<=15/08/2017).*', a) m.group(0) 

Tienes que devolver el grupo correcto:

 re.match("(.*?)15/08/2017",a).group(1) 

Necesitas usar grupo (1)

 import re re.match("(.*?)15/08/2017",a).group(1) 

Salida

 '172 211 342 ' 

Sobre la base de su expresión, esto es lo que creo que necesita:

 import re a='172 211 342 15/08/2017 TRANSFER OF LAND $610,000 CASH & MTGE' re.match("(.*?)(\w+/)",a).group(1) 

Salida:

 '172 211 342 ' 

Puedes hacerlo usando el group(1)

 re.match("(.*?)15/08/2017",a).group(1) 

ACTUALIZAR

Para una cadena actualizada puede usar .search lugar de .match

 re.search("(.*?)15\/08\/2017",a).group(1) 

Su problema es que su cadena está formateada como es. La línea que estás buscando es

182 246 612 01/10/2018 PHASED OF CASH & MTGE

Y luego estás buscando lo que siempre viene después de ‘FASADO’ y algunos espacios.

Quieres buscar

(? <= PHASED OF) \ s * (? P. *?) \ N

en tu cadena Esto devolverá un objeto coincidente que contiene el valor que está buscando en el value grupo.

 m = re.search(r'(?<=PHASED OF)\s*(?P.*?)\n', a) your_desired_text = m.group('your_text') 

También: hay muchos buenos probadores de expresiones regulares en línea para jugar con tus expresiones regulares. Y solo después de terminar la expresión regular, simplemente cópiela y péguela en python.

Yo uso este: https://regex101.com/