我有

s = '10001001110100000'

我想提取所有匹配项( '0' s 之间的 '1' s,包括边缘的 '1' s)。对于这个例子,结果应该是 [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)))

关于python - 从 PyParsing 中的字符串中检索多个重叠匹配项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58774779/

10-12 23:15