Expresión regular: une todo después de una palabra en particular

Estoy usando Python y me gustaría hacer coincidir todas las palabras después de la test hasta que se encuentre un punto (parada completa) o espacio.

 text = "test : match this." 

En este momento, estoy usando:

 import re re.match('(?<=test :).*',text) 

El código anterior no coincide con nada. Necesito hacer match this como mi salida.

No veo por qué quiere usar expresiones regulares si solo obtiene un subconjunto de una cadena.

Esto funciona de la misma manera:

 if line.startswith('test:'): print(line[5:line.find('.')]) 

ejemplo:

 >>> line = "test: match this." >>> print(line[5:line.find('.')]) match this 

El regex es lento, es difícil de diseñar y difícil de depurar. Definitivamente hay ocasiones para usarlo, pero si solo desea extraer el texto entre la test: y . , entonces no creo que sea una de esas ocasiones.

Consulte: https://softwareengineering.stackexchange.com/questions/113237/when-you-should-not-use-regular-expressions

Para mayor flexibilidad (por ejemplo, si recorres una lista de cadenas que quieres encontrar al principio de una cadena y luego indexas) reemplaza 5 (la longitud de ‘test:’) en el índice con len(str_you_looked_for) .

Debe usar re.search ya que re.match intenta coincidir desde el principio de la cadena. Para coincidir hasta que se encuentre un espacio o período.

 re.search(r'(?<=test :)[^.\s]*',text) 

Para hacer coincidir todos los caracteres hasta que se encuentre un período,

 re.search(r'(?<=test :)[^.]*',text) 

En un caso general, como lo menciona el título, puede capturar con (.*) patrón de 0 o más caracteres distintos a la nueva línea después de cualquier patrón (s) que desee:

 import re p = re.compile(r'test\s*:\s*(.*)') s = "test : match this." m = p.search(s) # Run a regex search anywhere inside a string if m: # If there is a match print(m.group(1)) # Print Group 1 value 

Si tu quieres para hacer coincidir varias líneas, compile la expresión regular con re.DOTALL o re.S flag (o agregue (?s) antes del patrón):

 p = re.compile(r'test\s*:\s*(.*)', re.DOTALL) p = re.compile(r'(?s)test\s*:\s*(.*)') 

Sin embargo, volverá a coincidir match this. . Véase también una demostración de expresiones regulares .

Usted puede agregar \. Patrón después de (.*) para hacer que el motor de expresiones regulares se detenga antes del último . en esa línea:

 test\s*:\s*(.*)\. 

Tenga cuidado con re.match() ya que solo buscará una coincidencia al principio de la cadena (Avinash ya lo señaló, ¡pero es una nota muy importante!)

Vea la demostración de expresiones regulares y un fragmento de código de Python de muestra :

 import re p = re.compile(r'test\s*:\s*(.*)\.') s = "test : match this." m = p.search(s) # Run a regex search anywhere inside a string if m: # If there is a match print(m.group(1)) # Print Group 1 value 

Si desea asegurarse de que la test coincida con una palabra completa, agregue \b antes de ella (¡no elimine el prefijo r del literal de cadena, o '\b' coincidirá con un carácter de RETROCESO!) r'\btest\s*:\s*(.*)\.' .

Todo después de la prueba, incluida la prueba.

 test.* 

Todo después de la prueba, sin prueba.

 (?<=video).* 

Ejemplo aquí en regexr.com