Это может быть шагом к решению:
import unicodedata
EXCEPTIONS= frozenset(u"'.")
CATEGORIES= frozenset( ('Lu', 'Ll', 'Lt', 'Pd', 'Zs') )
# O'Rourke, Franklin D. Roosevelt
def test_unicode_name(unicode_name):
return all(
uchar in EXCEPTIONS
or unicodedata.category(uchar) in CATEGORIES
for uchar in unicode_name)
>>> test_unicode_name(u"Michael O'Rourke")
True
>>> test_unicode_name(u"Χρήστος Γεωργίου")
True
>>> test_unicode_name(u"Jean-Luc Géraud")
True
Добавление исключений и дальнейшие проверки, которые я, возможно, пропустил.