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