2011-11-16 14 views
7

Estoy tratando de volcar datos de un archivo de exportación SQL con expresión regular. Para que coincida con el campo del contenido de la publicación, uso '(?P<content>.*?)'. Funciona bien la mayor parte del tiempo, pero si el campo contiene la cadena de '\ n' la expresión regular no coincidiría. ¿Cómo puedo modificar la expresión regular para que coincida con ellos? ¡Gracias!Expresión regular: cómo hacer coincidir una cadena que contenga " n" (nueva línea)?

Ejemplo (estoy usando Python):

>>> re.findall("'(?P<content>.*?)'","'<p>something, something else</p>'") 
['<p>something, something else</p>'] 

>>> re.findall("'(?P<content>.*?)'","'<p>something, \n something else</p>'") 
[] 

P.S. Aparentemente, todas las cadenas con '\' en el frente se tratan como caracteres de escape. ¿Cómo puedo decirle a regx que los trate como son?

Respuesta

21

que puedes usar DOTALL opción:

>>> re.findall("'(?P<content>.*?)'","'<p>something, \n something else</p>'", re.DOTALL) 
['<p>something, \n something else</p>'] 

Ver this.

+0

Gracias! Además, solo por ejemplo, si digo '\ a' en la cadena, se convertirá en '\ x07'. ¿Hay alguna manera de mantenerlos como están? ¿O si no importa cuando los coloco en la base de datos? –

+1

'\ x07' es solo una forma de que python represente al personaje con el código 7. Otra forma de representarlo es escribir' \ a'. La cadena realmente contiene solo un carácter en ambos casos. Puede confirmar esto marcando 'len (" \ x07 ")' y 'len (" \ a ")'. También intente comparar '" \ a "==" \ x07 "' o buscar '" a "' en '" \ a "': '" \ a ".find (" a ")' o para '" 0 " 'in' "\ x07" ':' "\ x07" .find ("0") '. Los resultados deben ser muy informativos. –

+0

Hola Adam! Todavía presenta un problema, si la cadena de origen contiene \ 'El resultado se convertirá en', lo que romperá los comandos sql. Entonces, es importante tener la cadena "tal como está" –

3

Necesita el modificador Dotall para que el punto también coincida con los caracteres de nueva línea.

re.S
re.DOTALL
Hacer el '' personaje especial que coincide con cualquier carácter en todos, incluyendo una nueva línea; sin esta bandera, '.' coincidirá con cualquier cosa excepto una nueva línea.

Ver que here on docs.python.org

Cuestiones relacionadas