我有
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。
天真的方法是遍历列表时循环并跟踪最后一个"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