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

Han*_*ila 2 python regex string parsing

好,

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

例如:

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

对不起,如果我无法解释清楚,但这不像非母语人士那么容易.

zmo*_*zmo 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\'"'
Run Code Online (Sandbox Code Playgroud)

但是如果你想从包含一个或几个完整的python语句的字符串中提取python字符串,你可以这样做:

def get_string(s):
    for it in ast.walk(ast.parse(s)):
        if isinstance(it, ast.Str):
            yield it.s
Run Code Online (Sandbox Code Playgroud)

结果如下:

>>> for i in get_string(r"'Hello World!'"): print i
... 
Hello World!
Run Code Online (Sandbox Code Playgroud)

对于下面的匹配,要获得您期望的结果,您需要将字符串设置为原始字符串:

>>> 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\'
Run Code Online (Sandbox Code Playgroud)

对于最后一场比赛,要获得您期望的结果,您需要将内部字符串设置为原始字符串:

>>> 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\'\"
Run Code Online (Sandbox Code Playgroud)

最后,即使非常规正则表达式可以完成这项工作,实际上使用用于解析python以解析python字符串的解析器总是更好的选择,因为你将使用相同的工具用于创建和解析python字符串!