Я пытаюсь поймать с помощью одного уникального регулярного выражения
either: ' PIC S9(17).' # with 'S9(17)' in Named Capture Group pic
either: ' PIC S9(13)V9(2).' # with 'S9(13)V9(2)' in Named Capture Group pic
either: ' PIC S9(9)V9(2) COMP-3.' # with 'S9(9)V9(2)' in Named Capture Group pic
either: ' PIC X(16).' # with 'X(16)' in Named Capture Group pic
с помощью r'\s*PIC\s+(?P<pic>\S+)'
Я ловлю все, кроме 'PI C S9 (9) V9 (2) COMP-3.'
с r'\s*PIC\s+(?P<pic>\S+) COMP-3'
Я ловлю только 'PI C S9 (9) V9 (2) COMP-3.'
Это мой Python код:
import re
def get_pics(data, pic):
base = r'^(?P<level>\d{2})\s+(?P<name>\S+)'
end = r'\.$'
pformat = "({})?"
pattern = re.compile(base + pformat.format(pic) + end)
for row in data.strip().split('\n'):
re_match = pattern.match(row.strip())
if not re_match:
print(' => NOP:\n ', row)
else:
match = re_match.groupdict()
print('ok:', match)
data = """
12 M-AR03-MONTANT-RDJ PIC S9(17).
12 M-AR03-COMPTE-RDJ PIC X(8).
09 M-N014-INC-CHARG-AMT-FSOL PIC S9(9)V9(2) COMP-3.
09 M-N014-CHARGE-TYPE-FSOL PIC X(5).
"""
Итак, мы получаем:
>>> get_pics(data, r'\s*PIC\s+(?P<pic>\S+)')
ok: {'level': '12', 'name': 'M-AR03-MONTANT-RDJ', 'pic': 'S9(17)'}
ok: {'level': '12', 'name': 'M-AR03-COMPTE-RDJ', 'pic': 'X(8)'}
=> NOP:
09 M-N014-INC-CHARG-AMT-FSOL PIC S9(9)V9(2) COMP-3.
ok: {'level': '09', 'name': 'M-N014-CHARGE-TYPE-FSOL', 'pic': 'X(5)'}
>>>
или
>>> get_pics(data, r'\s*PIC\s+(?P<pic>\S+) COMP-3')
=> NOP:
12 M-AR03-MONTANT-RDJ PIC S9(17).
=> NOP:
12 M-AR03-COMPTE-RDJ PIC X(8).
ok: {'level': '09', 'name': 'M-N014-INC-CHARG-AMT-FSOL', 'pic': 'S9(9)V9(2)'}
=> NOP:
09 M-N014-CHARGE-TYPE-FSOL PIC X(5).
>>>
Странно то, что в https://regex101.com/ '\s*PIC\s+(?P<pic>\S+)'
совпадают все 4 строки:
PIC S9(17).
PIC S9(13)V9(2).
PIC S9(9)V9(2) COMP-3.
PIC X(16).
Если я попробую регулярное выражение @ the четвертая птица, я получу:
In [2]: get_pics(data, r'\bPIC (?P<pic>(?:[A-Z]\d*\(\d+\))+)[^.\r\n]*\.')
...:
=> NOP:
12 M-AR03-MONTANT-RDJ PIC S9(17).
=> NOP:
12 M-AR03-COMPTE-RDJ PIC X(8).
=> NOP:
09 M-N014-INC-CHARG-AMT-FSOL PIC S9(9)V9(2) COMP-3.
=> NOP:
09 M-N014-CHARGE-TYPE-FSOL PIC X(5).
In [3]: