В ваших примерах кажется, что в обоих случаях вы можете решить проблему, получив «первые поля», «последние поля» и «все между ними»:
m = line.split("¬")[2].split()
firstname = m[0]
surname = m[-1]
initials = m[1:-1] # Maybe just keep this as a list?
И
m = line.split("¬")[4].split()
city = ' '.join(m[:-2])
state = m[-2]
zipCode = m[-1]
В общем случае вы можете обрабатывать одно поле, содержащее пробелы, получая «фиксированные» поля как из начала, так и из конца, и все, что осталось, - это поле, которое может содержать пробелы. Как только у вас появятся два поля, содержащие пробелы в той же колонке ничего не поделаешь. Это определено неоднозначно.
С имеющимся у вас форматом данных у вас могут возникнуть некоторые проблемы, если есть люди с именами или фамилиями, содержащими пробелы, такие как Роберт Ван де Графф. Это может быть решено, если у вас есть инициал, ища слова, содержащие только одну букву, такие как: Роберт Дж. Ван де Грааф, и используя их, чтобы определить, где начинаются и заканчиваются имена и фамилии. Но в целом у вас могут быть проблемы.
Также здесь скрыта проблема интернационализации: не все пишут свое «имя» в первую очередь - иногда они сначала пишут свою фамилию.