确定,
如果我有一个字符串,比如说x = 'Hello World!'
,我怎么解析那个字符串?
我知道我可以像"[^"]*"
一样使用正则表达式,但我如何解析所有有效的python字符串?解决方案不一定是正则表达式,但如果可行,那就太棒了。
例如:
x = 'Hello World!'
=> Hello World!
x = '\'Stack Overflow\''
=> \'Stack Overflow\'
x = 'x=\"x=\'Python\n\'\"'
=> x=\"x=\'Python\n\'\"
很抱歉,如果我无法解释清楚,但这不像非母语人士那么容易。
答案 0 :(得分:5)
嗯,最简单的方法是使用ast.literal_eval()
:
>>> literal_eval(r"'Hello World!'")
'Hello World!'
>>> literal_eval(r"'\'Stack Overflow\''")
"'Stack Overflow'"
>>> literal_eval(r"""'x=\"x=\'Python\n\'\"'""")
'x="x=\'Python\n\'"'
但是如果你想从包含一个或几个完整python语句的字符串中提取python字符串,你可以这样做:
def get_string(s):
for it in ast.walk(ast.parse(s)):
if isinstance(it, ast.Str):
yield it.s
结果如下:
>>> for i in get_string(r"'Hello World!'"): print i
...
Hello World!
对于以下匹配,要获得您期望的结果,您需要将字符串设置为原始字符串:
>>> for i in get_string("x = '\'Stack Overflow\''"): print i
...
'Stack Overflow'
>>> for i in get_string(r"x = '\'Stack Overflow\''"): print i
...
\'Stack Overflow\'
对于最后一场比赛,要获得结果,您需要将内部字符串设置为原始字符串:
>>> for i in get_string(r"""x = 'x=\"x=\'Python\n\'\"'"""): print i
...
x="x='Python
'"
>>> for i in get_string(r"""x = r'x=\"x=\'Python\n\'\"'"""): print i
...
x=\"x=\'Python\n\'\"
最后,即使non-regular regex可以完成这项工作,实际使用解析器来解析python字符串也是一个更好的选择,因为你将会使用用于创建和解析python字符串的相同工具!