2012-09-12 18 views
7

Mi expresión regular no está haciendo nada en mi cadena.expresión regular de python que coincide con cualquier cosa

pitón

data = 'random\n<article stuff\n</article>random stuff' 
datareg = re.sub(r'.*<article(.*)</article>.*', r'<article\1</article>', data, flags=re.MULTILINE) 
print datareg 

me sale

random 
<article stuff 
</article>random stuff 

quiero

<article stuff 
</article> 
+2

Aw, vamos: No [Cthulhu Parsing] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) de nuevo . – pillmuncher

+0

@pillmuncher: parece HTML mal formado para mí, así que dudo que un analizador HTML pueda trabajar con él muy fácilmente. – Blender

+0

@Blender: creo que tienes razón. Pero la sustitución tampoco parece ser un XML válido. Me pregunto, ¿para qué necesita XML roto? – pillmuncher

Respuesta

10

re.MULTILINE en realidad no hacer su multilínea expresiones regulares en la forma en que quiere que sea.

Cuando se especifica, el carácter de patrón '^' coincide al principio de la cadena y al comienzo de cada línea (inmediatamente después de cada nueva línea); y el carácter de patrón '$' coincide al final de la cuerda y al final de cada línea (inmediatamente antes de cada nueva línea). De forma predeterminada, '^' coincide solo al principio de la cadena y '$' solo al final de la cadena e inmediatamente antes de la nueva línea (si corresponde) al final de la cadena.

re.DOTALL hace:

hacer que el personaje especial '.' cualquier carácter en absoluto, incluyendo una nueva línea; sin esta bandera, '.' coincidirá con cualquier cosa excepto una nueva línea.

Cambio flags=re.MULTILINE a flags=re.DOTALL y su expresión regular funcionará.

+0

impresionante, marcará como correcto :) ¡gracias! – user1442957

+0

me salvó el día! Gracias – silviomoreto

Cuestiones relacionadas