Регулярное выражение: разделить по группам вхождений - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь найти решение для разделения строки по вхождению в группы.

Строки отформатированы так: "AAA/BBB/CCC/DDD/BBB/CCC/DDD/BBB/DDD"

Я хочу, чтобы строка разделялась следующим образом:

1) AAA/BBB/CCC/DDD

2) BBB/CCC/DDD

3) BBB/DDD

'/' всегда является разделителем, а слова всегда AAA, BBB, CCC и DDD.

Я пробовал выражение регулярного выражения (AAA|BBB|CCC|DDD){x} с {x}, чтобы указать количество вхождений, но, похоже, {} работает только для символов, а не слов.

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Вы можете использовать re.split с шаблоном чередования, который включает косые черты, которые окружены положительными шаблонами lookbehind и lookahead, чтобы гарантировать, что символ, предшествующий слешу, должен быть последним в последовательности, чем символ, следующий за слешем:

import re
s = 'AAA/BBB/CCC/DDD/BBB/CCC/DDD/BBB/DDD'
re.split('(?:(?<=[BCD])/(?=A)|(?<=[CD])/(?=B)|(?<=D)/(?=C))', s)

Возвращает:

['AAA/BBB/CCC/DDD', 'BBB/CCC/DDD', 'BBB/DDD']
1 голос
/ 28 марта 2019

Вы можете использовать re.findall со следующими положительными шаблонами просмотра, чтобы гарантировать, что косые черты включены, только если за ними следуют символы, которые разрешены в последовательности, и использовать ? в качестве повторителя, чтобы сопоставить каждое словонеобязательный (но жадный):

import re
s = 'AAA/BBB/CCC/DDD/BBB/CCC/DDD/BBB/DDD'
re.findall('(?=[ABCD])(?:AAA(?:/(?=[BCD]))?)?(?:BBB(?:/(?=[CD]))?)?(?:CCC(?:/(?=D))?)?(?:DDD)?', s)

Возвращает:

['AAA/BBB/CCC/DDD', 'BBB/CCC/DDD', 'BBB/DDD']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...