import re rx = re.compile(r''' (?P<category>[A-Z][A-Z- ]+[A-Z]) [. ]+ (?P<value>-?\d[.\d]+)\ (?P<unit>M|DEG|KN) ''', re.VERBOSE) string = ''' WATER DEPTH .......... 20.00 M TENSION AT TOUCHDOWN . 382.47 KN TOUCHDOWN X-COORD. ... -206.75 M BOTTOM SLOPE ANGLE ... 0.000 DEG PROJECTED SPAN LENGTH 166.74 M PIPE LENGTH GAIN ..... 1.72 M ''' matches = [(m.group('category'), m.group('value'), m.group('unit')) \ for m in rx.finditer(string)] print(matches)
Standard input is empty
[('WATER DEPTH', '20.00', 'M'), ('TENSION AT TOUCHDOWN', '382.47', 'KN'), ('TOUCHDOWN X-COORD', '-206.75', 'M'), ('BOTTOM SLOPE ANGLE', '0.000', 'DEG'), ('PROJECTED SPAN LENGTH', '166.74', 'M'), ('PIPE LENGTH GAIN', '1.72', 'M')]