Вот один подход, использующий обходные пути нулевой ширины для выделения каждого имени:
string = "555-1239Moe Szyslak(636) 555-0113Burns, C. Montgomery555 -6542Rev. Timothy Lovejoy555 8904Ned Flanders636-555-3226Simpson, Homer5553642Dr. Julius Hibbert"
result = re.findall(r'(?:(?<=^)|(?<=[^A-Za-z.,]))[A-Za-z.,]+(?: [A-Za-z.,]+)*(?:(?=[^A-Za-z.,])|(?=$))', string)
print(result)
['Moe Szyslak', 'Burns, C. Montgomery', 'Rev. Timothy Lovejoy', 'Ned Flanders',
'Simpson, Homer', 'Dr. Julius Hibbert']
Фактический шаблон соответствует этому:
[A-Za-z.,]+(?: [A-Za-z.,]+)*
Это означает совпадение с любой заглавной или строчной буквой, точкой или точкой, за которым следует пробел и один или несколько одинаковых символов, ноль или более раз.
Кроме того, мы используем следующие обходные пути слева и справа от этого шаблона:
(?:(?<=^)|(?<=[^A-Za-z.,]))
Lookbehind and assert either the start of the string, or a non matching character
(?:(?=[^A-Za-z.,])|(?=$))
Lookahead and asser either the end of the string or a non matching character