首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非贪婪的词匹配在句法分析中?

非贪婪的词匹配在句法分析中?
EN

Stack Overflow用户
提问于 2016-10-08 14:28:01
回答 2查看 467关注 0票数 2

我想匹配一个以_foo_bar结尾的单词。我写了这个:

代码语言:javascript
复制
identifier = Word(alphanums + '_')
string     = identifier + Suppress('_') + oneOf('foo bar')

不幸的是,我意识到identifier是贪婪的,并且消耗了所有的关键字。

我如何迫使identifier不贪婪?

代码语言:javascript
复制
$ string.parseString('a_keyword_foo')
ParseException: Expected "_" (at char 13), (line:1, col:14)

一些有效的关键字:

代码语言:javascript
复制
a_keyword_foo          # ['a_keyword', 'foo']
foo_bar_foo            # ['foo_bar',   'foo']
bar_bar                # ['bar',       'bar']

一些无效的关键字:

代码语言:javascript
复制
keyword_foo_foobar
2keywords_bar          # The leading number is perhaps another question...
foo _bar 
_foo
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-08 16:35:44

一旦你知道你在寻找什么,你就可以使用pp.SkipTo

代码语言:javascript
复制
In [38]: foo_or_bar = Literal('foo') | Literal('bar')

In [39]: string = SkipTo(Literal('_') + foo_or_bar) + Literal('_') + foo_or_bar

In [42]: string.parseString('frumpy _foo')
Out[42]: (['frumpy ', '_', 'foo'], {})

不幸的是,您也得到了这种行为,尽管:

代码语言:javascript
复制
In [44]: string.parseString('frumpy _foo _foo')
Out[44]: (['frumpy ', '_', 'foo'], {})

如果模式可以出现不止一次。

问题是pyparsing不做前瞻性工作。如果您也关注第二种情况,则必须将其定义为以下划线+ foo或bar结尾的一个或多个东西(如上面所示),然后选择最后一个。

票数 2
EN

Stack Overflow用户

发布于 2016-10-08 18:28:18

如果必须/可以切换到re api,则可以在那里使用非贪婪的匹配:

代码语言:javascript
复制
    import re
    p = re.compile (r"""([a-z_]+?)        # lazy matching identifier
                         _ (bar|foo)      # _ with foo or bar
       """, re.VERBOSE)
    subject_string = 'a_hello_foo'
    m = p.match( subject_string )
    print "groups:", m.groups()
    print "group 1:", m.group(1)

在Within解析中,也存在使用regex的可能性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39933553

复制
相关文章

相似问题

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