сначала я подумал, что рекомендую попробовать создать собственный буквенный класс из метода unicodedata.category
python, который, при наличии символа, скажет вам, какой класс назначен этой кодовой точке в соответствии с юникодом категория персонажей ; это скажет вам, является ли кодовая точка, например, заглавная или строчная буква, цифра или что-то еще.
о второй мысли и напоминающей ответ, который я дал на днях , позвольте мне предложить другой подход. Есть много неявных допущений, от которых мы должны избавиться при переходе от национального к глобальному; одна из них, безусловно, заключается в том, что «символ равен байту», а другая - в том, что «имя человека состоит из букв, и я знаю, какие это возможные буквы». Юникод обширен, и в настоящее время в ЕС существует 23 официальных языка, написанных на трех алфавитах; Точно то, какие символы используются для каждого языка, потребует немало усилий для выяснения. греческий язык использует эти причудливые апострофии и распределяется как минимум по 367 кодам; болгарский язык использует кириллицу с множеством дополнительных символов, уникальных для языка.
так почему бы просто не перевернуть таблицы и не использовать преимущества более широкого контекста, в котором эти имена появляются? я просмотрел некоторые примеры данных, и похоже, что общий шаблон для имен MEP LASTNAME, Firstname
с (1) фамилией в (почти) верхнем регистре; (2) запятая и пробел; (3) данные имена в обычном случае . это справедливо даже для более «отклоняющихся» примеров, таких как GERINGER de OEDENBERG, Lidia Joanna
, GALLAGHER, Pat the Cope
(вау), McGUINNESS, Mairead
. Требуется некоторая работа, чтобы восстановить обычный регистр из фамилий (возможно, оставить все строчные буквы на месте, и любые строчные буквы, которым предшествуют другие заглавные буквы), но извлечь имена, на самом деле просто:
fullname := lastname ", " firstname
lastname := character+
firstname := character+
это верно - поскольку EUP было так приятно представлять имена, заключенные в тег HTML, вы уже знаете его максимальный экстент, поэтому вы можете просто вырезать этот максимальный экстент и разделить его на две части. на мой взгляд, все, что вам нужно искать, - это первое вхождение последовательности запятой, пробела - все, что до этого является последним, все, что стоит за данными именами . я называю это «силуэтным подходом», поскольку это похоже на то, как форма выглядит, а не на позитив, а на контур, а не на позитив.
как было отмечено ранее, некоторые имена используют дефисы; теперь есть несколько кодовых точек в юникоде, которые выглядят как дефисы. Будем надеяться, что машинистки в Брюсселе были последовательны в их использовании. ах, и есть много фамилий, использующих апострофы, например d'Hondt
, d'Alambert
. счастливая охота: возможные воплощения включают U + 0060, U + 00B4, U + 0027, U + 02BC и значительное количество двойников. большинство из этих кодовых точек было бы «неправильным» для использования в фамилиях, но когда вы в последний раз видели, как правильно использовались эти точки?
я несколько не доверяю этой модели alphanums + alphas8bit + extended_chars + special_chars
; по крайней мере, эта часть alphanums
немного приземистая, так как кажется, что она содержит цифры (какие из них? unicode определяет несколько сотен цифр), и что alphas8bit
вещь пахнет растворителем, сделанным для другого времени. Unicode концептуально работает в 32-битном пространстве. что значит 8bit? буквы найдены в кодовой странице 852? давай это 2010 год.
ах, и, оглядываясь назад, я вижу, что вы, похоже, разбираете HTML с помощью pyparsing. не делай этого . используйте, например, красивый суп для сортировки разметки ; он неплохо справляется даже с неисправным HTML (большая часть HTML в дикой природе не проверяет), и как только вы поймете, что это за чудесно чудесный API (все, что вам когда-либо понадобится, это, вероятно, метод find()
), его будет легко найти именно те фрагменты текста, которые вы ищете.