2013-04-10 1 views
7

Имена в форме: Цезарь, Юлий должны быть разделены на First_name Julius Surname Ceasar.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) 

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

Возможно ли это?

(что я смотрел до сих пор: Dive into python 3 on UTF-8 vs Unicode; Это Regex tutorial на Unicode (который я не использую), я думаю, что мне не нужно new regex, но я признаю, что я не читал всю свою документацию)

+0

Почему не 'pat = r '^ ([^,] +), (. *) $''? –

+0

@Cristian: не будет ли это также соответствовать 'G @ rd $ tr% m, Joe'? До таких времен мне нужно будет разбирать причудливые twitternames, я бы предпочел. Все же. Но спасибо! – RolfBly

ответ

3

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

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

[^\W\d_] 

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

+0

Большое спасибо за это. Я задавался вопросом о [^ \ W] отрицании сокращенных классов. Он говорит, что «может использоваться внутри класса, но это путает», в Regex Яна Гойерэрта [Ссылка] [ref]. Я думаю, что это не намного более запутанно, чем само регулярное выражение. [ref] [http://www.regular-expressions.info/reference.html] – RolfBly

+1

Я думаю, что двойное отрицание требует от некоторых привыканий ... –

Смежные вопросы