从 PyParsing 中的字符串中检索多个重叠匹配项

Retrieve several overlapping matches from a string in PyParsing

我有

s = '10001001110100000'

我想提取所有匹配项('1' 之间的 '0',包括边缘的 '1'。对于这个例子,结果应该是 [10001, 1001, 101]

我使用 PyParsing 编写了一个简单的表达式,但令我惊讶的是找到解决方案如此困难,因为 PyParsing 仅返回第一个匹配项。

到目前为止我的代码:

from pyparsing import Group, OneOrMore, ZeroOrMore

s = '10001001110100000'
expr = ('1' + OneOrMore('0') + '1')
rule = ZeroOrMore(Group(expr))
print(rule.parseString(str).asList())

产生:

[['1', '0', '0', '0', '1']]

预期结果:

['10001', '1001', '101']

如何获取其他匹配项?

此问题特定于 PyParsing。

一种天真的方法是在列表中移动时循环并跟踪最后一个 "1"

s = '10001001110100000'
res = []
last_i = s.find('1')

for i in range(last_i, len(s)):
    if s[i] == '1':
        if i - last_i > 1:
            res.append(s[last_i:i+1])

        last_i = i

print(res) # => ['10001', '1001', '101']

正则表达式不适合这样的任务,因为匹配重叠但 PyParsing 似乎在 ParserElement#scanString 方法上有一个重叠选项:

from pyparsing import Group, OneOrMore, ZeroOrMore

s = '10001001110100000'
rule = ZeroOrMore(Group(('1' + OneOrMore('0') + '1')))
print(list(rule.scanString(s, overlap=True)))