我想匹配一个以_foo或_bar结尾的单词。我写了这个:
identifier = Word(alphanums + '_')
string = identifier + Suppress('_') + oneOf('foo bar')不幸的是,我意识到identifier是贪婪的,并且消耗了所有的关键字。
我如何迫使identifier不贪婪?
$ string.parseString('a_keyword_foo')
ParseException: Expected "_" (at char 13), (line:1, col:14)一些有效的关键字:
a_keyword_foo # ['a_keyword', 'foo']
foo_bar_foo # ['foo_bar', 'foo']
bar_bar # ['bar', 'bar']一些无效的关键字:
keyword_foo_foobar
2keywords_bar # The leading number is perhaps another question...
foo _bar
_foo发布于 2016-10-08 16:35:44
一旦你知道你在寻找什么,你就可以使用pp.SkipTo
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'], {})不幸的是,您也得到了这种行为,尽管:
In [44]: string.parseString('frumpy _foo _foo')
Out[44]: (['frumpy ', '_', 'foo'], {})如果模式可以出现不止一次。
问题是pyparsing不做前瞻性工作。如果您也关注第二种情况,则必须将其定义为以下划线+ foo或bar结尾的一个或多个东西(如上面所示),然后选择最后一个。
发布于 2016-10-08 18:28:18
如果必须/可以切换到re api,则可以在那里使用非贪婪的匹配:
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的可能性。
https://stackoverflow.com/questions/39933553
复制相似问题