Регулярное выражение Python 3 с диакритическими знаками и лигатурами,

Имена в форме: Цезарь, Юлий разделяются на Имя Юлий Фамилия Цезарь.

Имена могут содержать диакритические знаки (á à é ..) и лигатуры (æ, ø).

Кажется, этот код работает нормально в Python 3.3

import re

def doesmatch(pat, str):  
    try: 
        yup = re.search(pat, str)
        print('Firstname {0} lastname {1}'.format(yup.group(2), yup.group(1)))
    except AttributeError:
        print('no match for {0}'.format(str))

s = 'Révèrberë, Harry'
t = 'Åapö, Renée'
u = 'C3po, Robby'
v = 'Mærsk, Efraïm'
w = 'MacDønald, Ron'
x = 'Sträßle, Mpopo'

pat = r'^([^\d\s]+), ([^\d\s]+)'
# matches any letter, diacritic or ligature, but not digits or punctuation inside the () 

for i in s, t, u, v, w, x:
    doesmatch(pat, i)

Все, кроме тебя, совпадают. (нет совпадений для чисел в именах), но мне интересно, нет ли лучшего способа, чем нецифровой непространственный подход. Но что еще важнее: я хотел бы уточнить шаблон, чтобы он отделял заглавные буквы от строчных, но включая диакритические знаки и лигатуры заглавных букв, желательно также с использованием регулярных выражений. Как если бы ([A-Z] [a-z] +) соответствовал бы акцентированным и комбинированным символам.

Это возможно?

(то, на что я смотрел до сих пор: Погрузитесь в python 3 на UTF-8 против Unicode; Это Regex учебник по Unicode (который я не использую); я думаю, мне не нужен новое регулярное выражение, но я признаю, что не прочитал всю его документацию)


person RolfBly    schedule 10.04.2013    source источник
comment
Почему не pat = r'^([^,]+), (.*)$'?   -  person Cristian Ciupitu    schedule 11.04.2013
comment
@Cristian: разве это не совпадет с 'G @ rd $ tr% m, Joe'? До тех пор мне нужно будет разбирать вычурные имена, я бы не стал. Пока что. Но спасибо!   -  person RolfBly    schedule 12.04.2013


Ответы (1)


Если вы хотите различать прописные и строчные буквы с помощью модуля re стандартной библиотеки, то я боюсь, что вам придется вручную создать символьный класс всех соответствующих кодовых точек Unicode.

Если вам это действительно не нужно, используйте

[^\W\d_]

для соответствия любой букве Unicode. Этот класс символов соответствует всему, что «не является буквенно-цифровым символом» (что то же самое, что «буквенно-цифровой символ»), а также не является цифрой или подчеркиванием.

person Tim Pietzcker    schedule 10.04.2013
comment
Большое спасибо за это. Мне было интересно узнать о сокращенных классах [^ \ W]. В нем говорится, что его можно использовать внутри класса, но это сбивает с толку в Regex Яна Гойверса [Ссылка] [ссылка]. Я думаю, что это не намного более запутанно, чем само регулярное выражение. [ref] [regular-expressions.info/reference.html] - person RolfBly; 12.04.2013