pyparsing中Word的非贪婪匹配?
Non-greedy matching of Word in pyparsing?
我想匹配以 _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
一旦你知道你在找什么,你可以使用 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 结尾的东西(如上),然后取最后一个。
如果你 to/can 切换到 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)
在 pyparsing 中也可以使用正则表达式。
我想匹配以 _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
一旦你知道你在找什么,你可以使用 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 结尾的东西(如上),然后取最后一个。
如果你 to/can 切换到 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)
在 pyparsing 中也可以使用正则表达式。