Есть ли способ сгруппировать динамическую строку на основе фиксированных условий - PullRequest
0 голосов
/ 25 сентября 2019

Примеры строк:

sjdjd|shjdjd,A|shdahdajh,E|hsdhsdj,C|asnma,A
shabnmun|sjddamd,E|wqhsbn,E,teyiuiw,S|ssbxnsmcn,A|vscnbdcmdn,E
sanbsnk|scbdcbd,A

Я хочу создать 5 групп:

  1. Включает в себя первую строку, которая идет перед первой | - "sjdjd" в первойпример
  2. Все строки, имеющие ,A в разделе с разделителями
  3. Все строки, имеющие ,E в разделе с разделителями
  4. Все строки, имеющие ,C вРаздел с разделителями
  5. Все строки, имеющие ,S в разделе с разделителями

Шаблон, который я пробовал:

^(?:.+)\|(.+)\|(?:.+)\|(?:.+)\|(?:.+)+$

Ожидаемые группы

(группа 1 - sjdjd, shabnmun, sanbsnk), (группа 2 - shjdjd, asnma, ssbxnsmcn, scbdcbd), (группа 3 - shdahdajh, sjddamd, wqhsbn, vscnbdcmdn), группа 4 - hs (группа 4 - hs)- teyiuiw)

1 Ответ

2 голосов
/ 25 сентября 2019

Самое простое решение - просто выполнить несколько поисков и собрать:

import re

s = """sjdjd|shjdjd,A|shdahdajh,E|hsdhsdj,C|asnma,A
shabnmun|sjddamd,E|wqhsbn,E,teyiuiw,S|ssbxnsmcn,A|vscnbdcmdn,E
sanbsnk|scbdcbd,A"""

l1 = re.findall(r'^[^|]+', s, flags=re.MULTILINE)
lA = re.findall(r'(?<=[|,])[^|,]+(?=,A)', s)
lE = re.findall(r'(?<=[|,])[^|,]+(?=,E)', s)
lC = re.findall(r'(?<=[|,])[^|,]+(?=,C)', s)
lS = re.findall(r'(?<=[|,])[^|,]+(?=,S)', s)

groups = [l1, lA, lE, lC, lS]
for group in groups:
    print(group)

Отпечатки:

['sjdjd', 'shabnmun', 'sanbsnk']
['shjdjd', 'asnma', 'ssbxnsmcn', 'scbdcbd']
['shdahdajh', 'sjddamd', 'wqhsbn', 'vscnbdcmdn']
['hsdhsdj']
['teyiuiw']

См. Демонстрацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...