Отрезать обратную ссылку на регулярное выражение? Нокандо?

Имена в форме Нельсон, Крейг Т. нужно разделить на

AN Nelson
FN Craig
IT C.T. 

IT означает инициалы, обратите внимание, что первый инициал — это первая буква FN, имя.

У меня уже есть куча шаблонов в регулярных выражениях. Для этого я подозреваю, что регулярное выражение не подойдет, причина в том, что вы не можете нарезать обратную ссылку

import re

name = r'Nelson, Craig T.'
pat = r'([^\W\d_]+),\s([^\W\d_]+\s?)\s(([A-Z]\.?)+)\s?$'
rep = r'AN \1\nVN \2\nsf \3\n'  

split = re.sub(pat, rep, name)
print(split)

будет производить:

AN Nelson
FN Craig
IT T. 

В идеале я бы как-то нарезал \2, добавил точку и вставил \3 позади нее. Я думаю, что это невозможно с регулярным выражением, и я должен использовать строковую операцию, ОДНАКО, это будет не первый раз, когда я изучу здесь трюк, который я не вывел из документация. (Спасибо, парни.)


person RolfBly    schedule 18.04.2013    source источник
comment
Просто общий комментарий: вы действительно находите [^\W\d_] более читаемым, чем [a-zA-Z]? Я должен сказать, что мне пришлось подумать об этом классе персонажей в течение нескольких секунд. ;)   -  person Martin Ender    schedule 19.04.2013
comment
@m.buettner Я думаю, что ответ можно найти в ответе на другой вопрос автора: Регулярное выражение Python 3 с диакритическими знаками и лигатурами   -  person Alexey    schedule 19.04.2013
comment
@ Алексей, честно ... Я думал, что встроенные классы символов Python используют свойства Unicode только при использовании с модификатором re.U.   -  person Martin Ender    schedule 19.04.2013
comment
@M.Büttner Алексей совершенно прав   -  person RolfBly    schedule 19.04.2013
comment
@RolfBly Пожалуйста, не забудьте выбрать правильный ответ, если ваш вопрос был решен;)   -  person Alexey    schedule 24.04.2013


Ответы (3)


Вы можете использовать еще одну группу для первого инициала, например:

pat = r'([^\W\d_]+),\s(([^\W\d_])[^\W\d_]*\s?)\s(([A-Z]\.?)+)\s?$'
rep = r'AN \1\nVN \2\nIT \3.\4\n' 

Я также исправил sf вместо IT для инициалов в переменной rep.

person Alexey    schedule 18.04.2013

Вместо подмены играйте группами

import re

name = r'Nelson, Craig T.'
pat = r'([^\W\d_]+),\s([^\W\d_]+\s?)\s(([A-Z]\.?)+)\s?$' 
fmt = 'AN {last}\nVN {first}\nsf {initials}\n'

mtch = re.match(pat, name)

last_name, first_name, mid_name = mtch.group(1, 2, 3)

parsed = fmt.format(last=last_name, first=first_name, initials=last_name[0]+'.'+mid_name)
print(parsed)
person J0HN    schedule 18.04.2013

Я собирался сказать "О, неважно", но вы все были быстрее :-)

import re

name = r'Nelson, Craig T.'
pat = r'([^\W\d_]+),\s(([A-Z])[^\W\d_]+\s?)\s(([A-Z]\.?)+)\s?$'
rep = r'AN \1\nVN \2\nsf \3.\4\n'  

split = re.sub(pat, rep, name)
print(split)

Это всего лишь небольшая вариация предложения Алексея. Здесь я бы предпочел настоящую заглавную букву имени (VN).

person RolfBly    schedule 19.04.2013