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

问题描述 投票:1回答:1

我有

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']

如何获得其他比赛?

PS:此问题特定于PyParsing。

python python-3.x pyparsing
1个回答
1
投票

天真的方法是遍历列表时循环并跟踪最后一个"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似乎具有重叠选项:

ParserElement#scanString
© www.soinside.com 2019 - 2024. All rights reserved.