2013-04-18 1 views
2

이름의 형식은 넬슨, 크레이그 T. 첫 번째 초기는 FN, 이름의 첫 번째 문자주의, IT가 이니셜을 의미슬라이스 정규식 백 레퍼런스? 노 칸도?

AN Nelson 
FN Craig 
IT C.T. 

로 분할 할 필요가있다.

나는 이미 정규식에서 많은 패턴을 가지고있다. 이 일을 위해, 내가 정규식하지 않을 생각, 이유의 존재가 : 당신이

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을 찌르십시오. 나는 이것이 정규 표현식으로는 가능하지 않다고 생각한다. 그러나 나는 문자열 연산을 사용해야한다. 그러나 나는 documentation에서 추론하지 않은 트릭을 처음 배울 수는 없을 것이다. (. 고마워)

+1

일반적인 코멘트 : '[^ \ W \ d_]'는 (는)'[a-zA-Z] '보다 읽기 쉽습니다. 나는 그 캐릭터 클래스에 대해 몇 초 동안 생각해야한다고 말해야한다. ;) –

+1

@ m.buettner 나는 그 대답이 저자의 또 다른 질문에 대한 답변에서 발견 될 수 있다고 생각한다 : [발음 구별 기호와 합자를 가진 Python 3 정규식] (http://stackoverflow.com/questions/15936315/python-3 -regex-with-diacritics-and-ligatures) – Alexey

+0

@Alexey fair enough ... 나는 파이썬의 내장 문자 클래스가're.U' 한정자와 함께 사용되는 경우에만 유니 코드 속성을 사용한다고 생각했습니다. –

답변

4

이 같은 최초의 초기에 대한 또 하나 개의 그룹을 사용할 수 있습니다 :

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

나는 또한 rep 변수에 이니셜을위한 sf 대신 IT을 가진 수정했습니다. 대신 대체의

1

, 그룹

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) 
0

나는 O는 신경 쓰지 말을하려고 한 플레이,하지만 당신은이 알렉세이의에 단지 약간의 변형입니다 모두 빠른

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)의 첫 글자를위한 실제 자본을 선호합니다.