我有
s = '10001001110100000'
我想提取所有匹配项('0'
之间的'1'
包括边缘的'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
似乎具有重叠选项:
ParserElement#scanString