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

2024-10-06 23:23:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有

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特有的


Tags: 代码fromimport表达式grouppyparsing解决方案rule
1条回答
网友
1楼 · 发布于 2024-10-06 23:23:10

一种简单的方法是在列表中移动时循环并跟踪最后一个"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']

Regex不适合这样的任务,因为匹配项重叠,但是PyParsing^{}方法上似乎有一个重叠选项:

from pyparsing import Group, OneOrMore, ZeroOrMore

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

相关问题 更多 >