首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python Parsley中访问整个匹配的字符串?

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

Stack Overflow用户
提问于 2013-11-25 15:39:51
回答 1查看 305关注 0票数 0

我使用OMeta和Python Parsley (http://parsley.readthedocs.org/)进行解析。有没有办法访问与特定规则匹配的字符串?

例如,考虑以下代码:

代码语言:javascript
复制
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.'}

我正在寻找一种方法来引用整个匹配来返回类似如下的内容:

代码语言:javascript
复制
{'match': '15032 La Cuarta St.', 'num': '15032', 'street': 'La Cuarta St.'}

以下代码可用于此目的:

代码语言:javascript
复制
g = parsley.makeGrammar('addr = <<digit+>:num ws <anything+>:street>:match -> {"num": num, "street": street, "match": match}', {})

然而,我有成百上千条规则,我希望避免包装每一条规则。

EN

回答 1

Stack Overflow用户

发布于 2013-11-25 21:12:01

如果我不想手动修改很多规则,下面是我将如何做的。它使用您的解决方案,但不需要手动编辑规则。如果你看一看https://github.com/python-parsley/parsley/blob/master/parsley.py的源代码,你甚至不需要添加一个对myMakeGrammar的调用。

代码语言:javascript
复制
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()

这会返回

代码语言:javascript
复制
{'num': '15032', 'street': 'La Cuarta St.', 'match': '15032 La Cuarta St.'}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20187065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档