Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python是否有一个非贪婪的解析选项?_Python_Parsing - Fatal编程技术网

Python是否有一个非贪婪的解析选项?

Python是否有一个非贪婪的解析选项?,python,parsing,Python,Parsing,一些动态语言具有非贪婪版本的代码解析。例如,朱莉娅 julia> Meta.parse("(x=1)@blahblah", 1, greedy=false) (:(x = 1), 6) 它只解析遇到的第一个表达式,在@blahblah之前停止,在本例中,它甚至不会与第一部分一起形成有效代码 Python有类似的功能吗 我想我可以循环调用compile并在字符串中一次添加一个字符,直到没有语法错误为止,尽管这看起来很浪费 Pyparsing将解析相当复杂的表达式,默认行为是在解析器规则没有

一些动态语言具有非贪婪版本的代码解析。例如,朱莉娅

julia> Meta.parse("(x=1)@blahblah", 1, greedy=false)
(:(x = 1), 6)
它只解析遇到的第一个表达式,在@blahblah之前停止,在本例中,它甚至不会与第一部分一起形成有效代码

Python有类似的功能吗


我想我可以循环调用compile并在字符串中一次添加一个字符,直到没有语法错误为止,尽管这看起来很浪费

Pyparsing将解析相当复杂的表达式,默认行为是在解析器规则没有找到任何其他要解析的内容时停止。例如,如果假设前导部分只是一些嵌套括号的任意字符串,则可以使用pyparsing的内置nestedExpr解析器:

更完整的示例可能是:

ppc = pp.pyparsing_common
assignment_expr = ppc.identifier + '=' + ppc.number
fn_call = ppc.identifier + pp.nestedExpr() # lazy definition of arg list in ()'s

# a woefully incomplete parser for Python statements
statement_expression = fn_call | assignment_expr

LPAR, RPAR = map(pp.Suppress, "()")
prefix = LPAR + statement_expression + RPAR
print(prefix.parseString(s))

注意:我是pyparsing的作者。

正则表达式是否算数?不,这里我想问的是解析完整的Python表达式,这不能单独用正则表达式来完成。谢谢,这看起来近乎完美!我很好奇现在正在阅读pyparser,这不是Python语法特有的,对吗?上面的代码片段是否有任何Python语法会失败?或者它允许的任何无效的Python代码?这个例子绝对不是关于Python语法的。我刚刚使用了nestedExpr,因为它是一个快速而肮脏的示例,可以解析示例字符串,以向您显示pyparsing的默认行为是非贪婪的。但正如我前面所说的,它将解析任何带有嵌套括号的字符串,不管Python是否有效。如果您想解析或限制与特定Python表达式匹配的内容,您需要做一些工作,用pyparsing的类来定义它
ppc = pp.pyparsing_common
assignment_expr = ppc.identifier + '=' + ppc.number
fn_call = ppc.identifier + pp.nestedExpr() # lazy definition of arg list in ()'s

# a woefully incomplete parser for Python statements
statement_expression = fn_call | assignment_expr

LPAR, RPAR = map(pp.Suppress, "()")
prefix = LPAR + statement_expression + RPAR
print(prefix.parseString(s))