SomethingButNotNickName
т.е. то, что вы предлагаете засунуть в словарь уже находится внутри класса
Это тебе кажется так.
Надо для каждого файла сделать свою функцию обработки
его строки. Функция такая: на вход принимается строка файла; на выходе возвращается словарь, в котором поля строки разделены по ключам.
Для каждого файла должна быть своя функция обработки строки этого файла.
Эти функции никакого отношения к твоему заданию не имеют. Они используются для того, чтобы точно работать с данными. Таким образом при чтении первого файла у тебя получаются словари из его строк, и в этих словарях можно легко искать любые поля (фамилию, имя, зарплату, часы), просто обращаясь к ним по именам. С сырой строкой ты этого не сделаешь, даже если сделаешь регулярку, потому что регулярка не будет тебе давать именованных полей.
SomethingButNotNickName
Ну а насчет регулярок?
Регулярки используются только внутри таких функций для разделения строк на поля. Больше нигде. Когда словарь для одной строки файла возвращён, поля в нём разделены точно и имеют удобные имена, поэтому никакие регулярки больше не требуются.
Твоя ошибка заключается в том, что ты пытаешься необработанные данные сразу анализировать. Надо сначала их приготовить, а потом уже готовые, сведённые к единой простой форме, анализировать.
Например, ты получил словарь первой строки первого файла и словарь первой строки второго файла. Эти словари разные, но брать поля из них легко. Ты берёшь из них поля (допустим, фамилии) и сравниваешь между собой. Если фамилии одинаковые, значит эти словари относятся к одному работнику и ты можешь из этих словарей брать следующие данные и куда-то их копировать или совместные вычисления проводить. Можно и просто взять два словаря, относящиеся к одному работнику, и сделать из них третий словарь, более полный. Вот твой этот класс, которые требуется в задании, имеет примерно такую структуру - словари из разных файлов, слитые в один словарь, и так по каждому работнику. Только вместо словаря используется класс, у которого внутри хранятся эти данные одного работника. Отличие словаря от класса в том, что класс может меняться по своему устройству, а словарь остаётся неизменным. Но класс может иметь и поведение, тогда как словарь используется только для хорошо структурированного хранения данных.
Пример
Разделение строки
>>> import re
>>>
>>> def split1(s):
... parts = re.findall(r'^(\S+).*\s(\S+)\s+(\d+)$', s)[0]
... out = {'surname': parts[0],
... 'firstname': parts[1],
... 'salary': int(parts[2])}
... return out
...
>>>
>>> s = 'Петров Герой труда Петр 100000'
>>>
>>> d = split1(s)
>>> d
{'surname': 'Петров', 'firstname': 'Петр', 'salary': 100000}
>>> d['salary'] * 2
200000
>>>
Несколько человек из файла
>>> import re
>>>
>>> def split1(s):
... parts = re.findall(r'^(\S+).*\s(\S+)\s+(\d+)$', s)[0]
... out = {'surname': parts[0],
... 'firstname': parts[1],
... 'salary': int(parts[2])}
... return out
...
>>>
>>> lst = ['Петров Герой труда Петр 100000',
... 'Иванов Саша 5100',
... 'Сидоров Старик Андрей 12345']
>>>
>>> out = list(map(split1, lst))
>>> out
[{'surname': 'Петров', 'firstname': 'Петр', 'salary': 100000}, {'surname': 'Иванов', 'firstname': 'Саша', 'salary': 5100}, {'surname': 'Сидоров', 'firstname': 'Андрей', 'salary': 12345}]
>>>
Разделение по всем полям
>>> import re
>>>
>>> def split1(s):
... parts = re.findall(r'^(\S+)\s*(.*)\s+(\S+)\s+(\d+)$', s)[0]
... out = {'surname': parts[0],
... 'firstname': parts[2],
... 'status': parts[1] or None,
... 'salary': int(parts[3])}
... return out
...
>>>
>>> lst = ['Петров Герой труда Петр 100000',
... 'Иванов Саша 5100',
... 'Сидоров Старик Андрей 12345']
>>>
>>> out = list(map(split1, lst))
>>> out
[{'surname': 'Петров', 'firstname': 'Петр', 'status': 'Герой труда', 'salary': 100000}, {'surname': 'Иванов', 'firstname': 'Саша', 'status': None, 'salary': 5100}, {'surname': 'Сидоров', 'firstname': 'Андрей', 'status': 'Старик', 'salary': 12345}]
>>>