2010-08-20 18 views
11

Sé que para el análisis idealmente debería eliminar todos los espacios y saltos de línea, pero estaba haciendo esto como una solución rápida para algo que estaba intentando y no puedo entender por qué no está funcionando. He envuelto diferentes áreas de texto en mi documento con las envolturas como "#### 1" y estoy tratando de analizar basado en esto, pero simplemente no funciona, no importa lo que intento, creo que estoy usando multilínea correctamente ... se agradece cualquier consejoPython regex, patrón coincidente en varias líneas ... ¿por qué no funciona?

esto devuelve ningún resultado en absoluto:

string=' 
####1 
ttteest 
####1 
ttttteeeestt 

####2 

ttest 
####2' 

import re 
pattern = '.*?####(.*?)####' 
returnmatch = re.compile(pattern, re.MULTILINE).findall(string) 
return returnmatch 
+1

No va a funcionar periodo porque no se está utilizando multilínea símbolos cadena ' ''' 'o' '' " ' –

+0

bien, echaba de menos este concepto por completo, voy a profundizar en la documentación para encontrar dónde menciona esto ... gracias – Rick

+3

Su asignación a 'cadena' es un error de sintaxis. ¿Quiso utilizar' '' ''? – msw

Respuesta

12

Trate re.findall(r"####(.*?)\s(.*?)\s####", string, re.DOTALL) (funciona con re.compile también, por supuesto).

Esta expresión regular devolverá tuplas que contengan el número de la sección y el contenido de la sección.

Para su ejemplo, esto devolverá [('1', 'ttteest'), ('2', ' \n\nttest')].

(Por cierto: tu ejemplo no se ejecutará, de líneas múltiples, usar o '''""")

+0

gracias, esto funciona – Rick

19

Multilínea no significa . coincidirá con la línea de retorno, significa que ^ y $ se limitan a sólo las líneas

RE.M re.MULTILINE

Cuando se especifique, el carácter patrón '^' coincide al principio de la cadena y en la> Begi nning de cada línea (inmediatamente después de cada nueva línea); y el carácter de patrón '$'> coincide al final de la cadena y al final de cada línea (inmediatamente antes de cada línea nueva). Por defecto, '^' coincide solo al comienzo de la cadena, y '$' solo en el> final de la cadena e inmediatamente antes de la nueva línea (si la hay) al final de la cadena.

re.S o re.DOTALL hace . partidos incluso nuevas líneas.

Fuente

http://docs.python.org/

Cuestiones relacionadas