2014-11-22 7 views
2

나는 전체 대문자 주소를 Title Case로 변환하는 Python 스크립트를 작성 중입니다. 내가 직면 한 문제는 번 16 번가과 같은 문자열에 .title()을 적용 할 때 사우스 16 번지이 발생한다는 것입니다. 원하는 변환은 사우스 16 th 스트리트입니다. 서문의 약어는 소문자입니다.제목의 나머지 문자열을 유지하면서 축약 된 서수의 대소 문자를 낮추려면 어떻게해야합니까?

이 작업을 수행하는 간단한 방법은 무엇입니까? 나는 어떤 종류의 정규식을 사용하려고 생각하고 있었다.

답변

3

그것은, 별도의 단어 목록에 문자열을 분할 각 단어를 대문자로 다음 다시 함께 가입하는 것이 가장 쉬운 방법이 될 수 있습니다

>>> address = "SOUTH 16TH STREET" 
>>> " ".join([word.capitalize() for word in address.split()]) 
'South 16th Street' 

capitalize() 방법은 대문자로 문자열의 첫 번째 문자를 설정하고 문자를 소문자로 진행합니다. 숫자에는 대문자/소문자 형식이 없기 때문에 필요에 따라 "16TH"및 이와 유사한 토큰이 변환됩니다.

2

사용이 정규식 기반 솔루션 :

import re 
convert = lambda s: " ".join([x.lower() if re.match("^\d+(ST|ND|RD|TH)$", x) is not None else x.title() for x in s.split()]) 

는 기본적으로, 문자열을 분할하고 서수 인 경우, 적절한 조치를 적용 할 각 단어를 참조하십시오.

+0

[]의 ' "".join'에 대한 인수 내부는 필요하지 않습니다. 그들은 임시 목록 이해력을 생성 한 다음'join'에 전달합니다. 'join'은 생성자 표현식을 완벽하게 처리 할 수 ​​있습니다. 이것은 생성자 표현식을 처리 할 수 ​​있습니다. 이 경우 실제로 퍼포먼스 이득을 얻지는 못하지만, Python 2.3이나 2.4 이후로 이러한 종류의 표현식에 들어갈 수있는 좋은 습관은 필요 없습니다. – PaulMcG

1
>>> str_='SOUTH 16TH STREET' 
>>> ' '.join([i.title() if i.isalpha() else i.lower() for i in str_.split()]) 
'South 16th Street' 
4

명시된 문제를 좁게 해결하려면 string.capwords()이 유용 할 수 있습니다. split -> capitalize -> join 시퀀스를 단일 명령으로 캡슐화합니다.

>>> address = "SOUTH 16TH STREET" 
>>> capwords(address) 
'South 16th Street' 

은 또한 파이썬의 이전 버전에 존재 ...

https://docs.python.org/3.4/library/string.html#string-functions

을에서 파이썬 3.4이 명령에 대한 자세한 정보를 참조하십시오.

그러나 일반적으로 주소 서식 지정에 대한 질문을 확대하면이 단순한 방식으로 문제가 발생할 수 있습니다. 보다 복잡한 (예 : 정규식 기반) 접근법이 필요할 수 있습니다. 내 로케일에서 예를 사용 :

>>> address = "Highway 99N" # Wanting'Highway 99N' 
>>> capwords(address) 
'Hwy 99n' 

주소 파싱 (및 서식하기) 때문에 합법적 인 주소의 변화의 양뿐만 아니라 사람들이 내용을 기록하는 다른 방법 (약어 등)에 사악한 문제입니다.

pyparsing 모듈은 정규식 접근 방식이 마음에 들지 않으면 이동 수단이 될 수도 있습니다.