2014-11-22 133 views
2

我正在研究一個python腳本來將完整的大寫地址轉換爲Title Case。我面臨的問題是,當我申請.title()像一個字符串如SOUTH 16TH STREET,我得到南16 TH。期望的轉換將是South 16 th Street,其中序號的縮寫是小寫。如何在縮寫字母大寫的情況下更改大寫字母的大小寫?

什麼是在Python中完成這個簡單的方法?我正在考慮使用某種正則表達式。

回答

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 2015-01-28 07:01:18

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 - >連接序列封裝爲一個命令。

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

參見在Python的3.4這個命令的詳細信息...

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

它也存在於早期版本的Python。

但是,通常會擴大您的問題以解決格式問題,您可能會遇到這種簡單化方法的麻煩。可能需要更復雜的(例如基於正則表達式的)方法。使用從我的語言環境的例子:

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

地址解析(和格式)是一個邪惡的問題,因爲在合法地址的變化量,以及不同方式的人會寫他們(縮寫等)。

如果你不喜歡正則表達式的方法,pyparsing模塊也可能是一種方法。