Python在字符串中查找python字符串

时间:2014-05-21 13:47:03

标签: python regex string parsing

确定,

如果我有一个字符串,比如说x = 'Hello World!',我怎么解析那个字符串? 我知道我可以像"[^"]*"一样使用正则表达式,但我如何解析所有有效的python字符串?解决方案不一定是正则表达式,但如果可行,那就太棒了。

例如:

  • x = 'Hello World!' => Hello World!
  • x = '\'Stack Overflow\'' => \'Stack Overflow\'
  • x = 'x=\"x=\'Python\n\'\"' => x=\"x=\'Python\n\'\"

很抱歉,如果我无法解释清楚,但这不像非母语人士那么容易。

1 个答案:

答案 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字符串的相同工具!