Получить несколько совпадающих совпадений из строки в PyParsing - PullRequest
2 голосов
/ 09 ноября 2019

У меня есть

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 Ответ

2 голосов
/ 09 ноября 2019

Наивный подход заключается в цикле и отслеживании последних "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)))
...