python регулярное выражение найти содержимое между последовательными разделителями - PullRequest
4 голосов
/ 01 августа 2020

Итак, у меня есть следующий текст:

a
111
b
222
c
333
d

, и я хочу захватить все содержимое между этими алфавитными разделителями. Поэтому я попробовал

import re
test_str=r"""a
111
b
222
c
333
d
"""
res = re.findall(r"[a-z]{1}\n([\d\D]+?)\n[a-z]{1}", test_str)

Обратите внимание, что [\d\D] предназначен для любого символа , включая новых строк, потому что в реальных примерах содержимое между ними может быть сложным и содержать много строк. В любом случае, мой ожидаемый результат:

['111', '222', '333']

, но вместо этого фактический результат

['111', '333']

Причина, по которой я думаю, в том, что когда первое вхождение a\n111\nb совпадает, это каким-то образом "забирается" из строки и не входит в последующий процесс сопоставления, что приводит к ошибке.

Есть ли какой-нибудь простой способ захватить содержимое между такими последовательными разделителями? Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 01 августа 2020

Вместо этого вы можете использовать (положительный) просмотр вперед:

r"(?s)[a-z]\n(.+?)(?=[a-z])" 

он не использует согласованную часть, просто гарантирует, что совпадение возможно.

res = re.findall(r"(?s)[a-z]\n(.+?)(?=[a-z])", test_str) # ['111\n', '222\n', '333\n']

См. https://regex101.com/r/6FEFkZ/2 или Python просмотр назад и вперед с регулярным выражением

0 голосов
/ 01 августа 2020

Это решение не будет использовать регулярное выражение, но оно простое и легкое для понимания

import string
teststr = """
111
a
222
b
333
"""
print([i for i in teststr.split('\n') if i not in string.ascii_lowercase])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...