2012-05-08 30 views
13

Quiero convertir una cadena literal como r"r'\nasdf'" en una cadena ('\\nasdf' en este caso).Python convierte literales de cadena a cadenas

Otro caso: r"'\nasdf'" a '\nasdf'. Espero que lo entiendas.

Esto es importante, porque tengo un analizador de scripts de Python, que quiere saber el contenido exacto de un literal de cadena.

¿Es eval una solución inteligente? Los literales de cadena se filtran antes (con tokenize) y no deben causar responsabilidades de seguridad. ¿No hay soluciones más nobles que la evaluación de un literal? Una biblioteca de analizador tal vez?

Editar: Agregué otros ejemplos, para evitar malentendidos.

+0

que sería una cadena 'en bruto', no un 'literal' –

+0

Creo que no formulé mi pregunta correctamente, estoy tratando de hacerlo bien otra vez. Quise decir cadenas literales, no cadenas en bruto. –

+0

lo suficientemente claro. y literal_eval es la solución más noble :) –

Respuesta

16

desea que el ast module:

>>> import ast 
>>> raw = r"r'\nasdf'" 
>>> ast.literal_eval(raw) 
'\\nasdf' 
>>> raw = r"'\nasdf'" 
>>> ast.literal_eval(raw) 
'\nasdf' 

Este es un método seguro para la evaluación de cadenas/análisis sintáctico que contienen código fuente de Python (a diferencia de eval()).

8

Sí, se encuentran:

>>> s = r'\nasdf' 
>>> s.decode('string-escape') 
'\nasdf' 
+0

Disculpa, mi pregunta no fue muy clara (he editado). Esta es una conversión de cadena en cadena, en lugar de una cadena de conversión literal. –