In [5]:
import re
opt_pattern_format = "({})?"
row_pattern_mic_multpergroup = r"""^(?P<multpergroup>[ GMP])"""
row_pattern_mic_level_names = r"""\s+(?P<level>\d)\s(?P<shortname>\S{2})\s+(?P<longname>\S+)"""
row_pattern_mic_typelength = r"""\s+(?P<type>[ABCDFILNPT])\s+(?P<length>\d+)"""
row_pattern_mic_scale = """\.(?P<scale>\d)"""
row_pattern_mic_null = r"""\s{2}(?P<null>[ NF])"""
row_pattern_mic_descsub = r"""\s(?P<descsub>[DS])"""
row_pattern_mic_header = r"""\s+HD=(?P<header>\S+)"""
row_pattern_mic_editmask = r"""\s+EM=(?P<editmask>\S+)"""

In [6]:
row_pattern_mic_ddm = re.compile(row_pattern_mic_multpergroup +
                                 row_pattern_mic_level_names +
                                 opt_pattern_format.format(row_pattern_mic_typelength) +
                                 opt_pattern_format.format(row_pattern_mic_scale) +
                                 opt_pattern_format.format(row_pattern_mic_null) +   
                                 opt_pattern_format.format(row_pattern_mic_descsub) +
                                 opt_pattern_format.format(row_pattern_mic_header) +
                                 opt_pattern_format.format(row_pattern_mic_editmask))

In [7]:
line = '  1 AA PERSONNEL-ID                      A  8.2    D        HD=PERSONNEL/ID'
#line = '  1 AH BIRTH                             D    6    D        HD=DATE/OF/BIRTH        EM=YYYY-MM-DD'
line = 'G 1 A1 FULL-ADDRESS'

In [8]:
match = row_pattern_mic_ddm.match(line)
match.groupdict()


Out[8]:
{'descsub': None,
 'editmask': None,
 'header': None,
 'length': None,
 'level': '1',
 'longname': 'FULL-ADDRESS',
 'multpergroup': 'G',
 'null': None,
 'scale': None,
 'shortname': 'A1',
 'type': None}

In [ ]: