我正在使用OMeta和Python Parsley(http://parsley.readthedocs.org/)进行解析。有没有办法访问特定规则匹配的字符串?
例如,请考虑以下代码:
In [1]: import parsley
In [2]: g = parsley.makeGrammar('addr = <digit+>:num ws <anything+>:street -> {"num": num, "street": street}', {})
In [3]: g('15032 La Cuarta St.').addr()
Out[3]: {'num': '15032', 'street': 'La Cuarta St.'}
我正在寻找一种方法来引用整个匹配来返回类似的内容:
{'match': '15032 La Cuarta St.', 'num': '15032', 'street': 'La Cuarta St.'}
以下代码可用于此目的:
g = parsley.makeGrammar('addr = <<digit+>:num ws <anything+>:street>:match -> {"num": num, "street": street, "match": match}', {})
但是,我有数以百计的规则,我想避免包装每一条规则。
答案 0 :(得分:0)
如果我不想手动修改许多规则,我会这样做。它使用您的解决方案,但不需要手动编辑规则。如果你看一下https://github.com/python-parsley/parsley/blob/master/parsley.py的来源,你就可以修补这个问题,那么你甚至不必添加对myMakeGrammar的调用。
import parsley
import re
prog = re.compile('([a-z]* =) (.*) -> {(.*)}')
def myMakeGrammar(grammar):
gs = prog.search('addr = <digit+>:num ws <anything+>:street -> {"num": num, "street": street}')
new_grammar = gs.group(1) + '<' + gs.group(2) + '>:match -> {' + gs.group(3) + ',"match": match}'
return new_grammar
g = parsley.makeGrammar(myMakeGrammar('addr = <digit+>:num ws <anything+>:street -> {"num": num, "street": street}'), {})
print g('15032 La Cuarta St.').addr()
返回
{'num': '15032', 'street': 'La Cuarta St.', 'match': '15032 La Cuarta St.'}