如何在Python Parsley中访问整个匹配的字符串?

时间:2013-11-25 07:39:51

标签: python ometa

我正在使用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}', {})

但是,我有数以百计的规则,我想避免包装每一条规则。

1 个答案:

答案 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.'}