0

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

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

4

1 回答 1

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.'}
于 2013-11-25T13:12:00.590 回答