Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.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 使用正则表达式表示nestedExpr的开启器_Python_Pyparsing - Fatal编程技术网

Python 使用正则表达式表示nestedExpr的开启器

Python 使用正则表达式表示nestedExpr的开启器,python,pyparsing,Python,Pyparsing,我正在尝试使用pyparsing来匹配嵌套表达式。不必指定内容表达式,有没有一种方法可以使用正则表达式来定义开场白 我的开场白由两个标记A和B组成。这两个标记可以用空格和换行符分隔,也可以不用空格和换行符分隔 在指定内容规则时,我能够为开场白创建pyparsing表达式。但是,有没有一种方法可以在不指定内容规则的情况下执行此操作?或者,如何指定忽略内容的规则 opener = Word('A') + ZeroOrMore(' ') + ZeroOrMore('\n') + Word('B') c

我正在尝试使用pyparsing来匹配嵌套表达式。不必指定内容表达式,有没有一种方法可以使用正则表达式来定义开场白

我的开场白由两个标记A和B组成。这两个标记可以用空格和换行符分隔,也可以不用空格和换行符分隔

在指定内容规则时,我能够为开场白创建pyparsing表达式。但是,有没有一种方法可以在不指定内容规则的情况下执行此操作?或者,如何指定忽略内容的规则

opener = Word('A') + ZeroOrMore(' ') + ZeroOrMore('\n') + Word('B')
closer = 'END'
content_rule = SkipTo(opener | closer)


pat = nestedExpr(opener=opener, closer=closer, content=content_rule) 


for x in pat.scanString(data):
    print x
背景: 我试图从源代码文件中提取if块。所以我需要一种提取嵌套表达式的方法。这要求我具体说明:

  • 一种由多个标记组成的开场白,这些标记可以用空格('if{')分隔
  • 一种方法,它只匹配对应于开头的结束标记。例如,其他块的闭包与IF块相同。考虑循环:例如:(){ }。但我不确定是否有可能。
  • 你说:

    不过,我不确定这是否可行

    至少对于一般C代码来说不是这样。例如:

    if (a) {
        char a = '}';
    }
    
    对于解析器来说,没有好的方法可以知道(与猜测相反)第一个关闭的大括号不是用来关闭if语句,而不是实际解析内部。(还有注释、双引号字符串等。更不用说没有大括号的if!)

    如果您确信内饰只有平衡的花括号,并且您只想要顶级的If语句,我的建议是这样做(未经测试,但希望它能让人理解):

    如果需要嵌套的ifs,可以执行以下操作:

    expression = Forward()
    if_statement = Literal('if') + nestedExpr("{", "}", expression)
    expression << ZeroOrMore(Or(if_statement, Regex('.')))
    
    expression=Forward()
    if_语句=Literal('if')+nestedExpr(“{”,“}”,表达式)
    
    表达式如果您提供更多关于您试图匹配的内容、原因以及显示的代码不起作用的方式的上下文,我们可能会提供更多帮助。谢谢Jesse。我更新了我的帖子。我更新了我的答案以尝试和帮助。在开场白表达式中不必显示可选的空格-这与甚至是pyparsing和regex。您可以将opener写成
    opener=Word('A')+Word('B')
    。另外,您确定Word在这里是正确的类吗?Word('A')将匹配“A”、“AAAA'、“aaaaaaaaaaaaaa”或任何一组连续的“A”。如果您只想匹配“A”,使用Literal类,而不是单词class。谢谢。使用不带内容规则的正则表达式失败(因此我的问题是如何指定一个规则来忽略所有内容):ValueError:如果没有给出内容表达式,则开始参数和结束参数必须是字符串。好的,这将有助于添加到您的问题中。谢谢!回答得很好。仅供参考-nestedExpr隐式防止在引用字符串中出现开始符和结束符。如果提供了注释表达式(通过调用
    ignore(commentExpr))则
    ),注释中的开头和结尾也得到了正确处理。此外,如果开头和结尾是您在pat中显示的字符串(而不是像OP所要求的expr),则不需要内容arg。因此,您的原始
    pat
    expr可以写成
    pat=nestedExpr(“{”,“}”)
    expression = Forward()
    if_statement = Literal('if') + nestedExpr("{", "}", expression)
    expression << ZeroOrMore(Or(if_statement, Regex('.')))