我正在閱讀許多用戶輸入的數據,這些數據表示來自文件的電話號碼。他們在所有不同略有進入:Python代碼接受許多不同格式的美國電話號碼?
5555555555 555-555-5555 555-555/5555 1555-555-5555 etc...
我怎麼能輕鬆地分析所有的Python這些電話號碼,併產生像一個典型的輸出: 555-555-5555?
我正在閱讀許多用戶輸入的數據,這些數據表示來自文件的電話號碼。他們在所有不同略有進入:Python代碼接受許多不同格式的美國電話號碼?
5555555555 555-555-5555 555-555/5555 1555-555-5555 etc...
我怎麼能輕鬆地分析所有的Python這些電話號碼,併產生像一個典型的輸出: 555-555-5555?
只拿數字與一個正則表達式左
import re
pnumber = re.sub("[^0-9]", "", input_number)
if pnumber[0] == 1:
pnumber = pnumber[1:]#strip 1st char if it's a 1
#insert the dashes
if len(pnumber) == 10:
pnumber = "%s-%s-%s" % (pnumber[:3],pnumber[3:6],pnumber[6:])
else:
#throw error
我不是美國人,但這適用於俄羅斯的電話號碼......也許它也適用於美國的呢?
def extractNumber(s):
"""take a string phone number and extract it to the legal string"""
target = ""
for char in s:
try:
target += int(s)
except ValueError:
target += '-'
return target
或親愛的,'TypeError' – SilentGhost 2009-11-13 18:45:57
確定要識別哪些格式,然後創建一個正則表達式匹配每一個分組的不同部分數字(如區號,前綴等)。最後使用替代產生你想要的規範輸出。
實施例:
匹配
xxx-xxx-xxxx -> \d{3}-\d{3}-\d{4}
(xxx) xxx-xxxx -> \(\d{3}\) \d{3}-\d{4}
1-xxx-xxx-xxx -> 1-\d{3}-\d{3}-\d{4}
這忽略了限制前綴和區域代碼的規則(美國不允許區域碼或其中0爲前綴或1)。你可以嘗試並超級聰明,並創建一個匹配所有內容的正則表達式,但最終會出現一個無法修改的混亂混亂,相反,您應該將這些模式組合在一起,以便將來修改它們。
基本思想:
pattern = re.compile(r'\d{3}-\d{3}-\d{4}|\(\d{3}\) \d{3}-\d{4}|1-\d{3}-\d{3}-\d{4}')
與分組添加了規範輸出
pattern = re.compile(r'(\d{3})-(\d{3})-(\d{4})|\((\d{3})\) (\d{3})-(\d{4})|1-(\d{3})-(\d{3})-(\d{4})')
然後只需運行,對您輸入每個電話號碼輸入您將有3個匹配的組,一個用於地區代碼,一個用於前綴,另一個用於後綴,您可以根據需要輸出。你需要對正則表達式有一個基本的理解,但是它不應該太難。
經過與string.maketrans
的一些準備,字符串'translate方法提供了非常快速和簡單的操作。我爲Python 2代碼提供了純字符串(Python 3和Python 2中的Unicode字符串,有點不同 - 請問是否需要這樣):
準備工作(一勞永逸,例如在模塊加載時間):
>>> import string
>>> allchars = string.maketrans('', '')
>>> nondigits = allchars.translate(allchars, string.digits)
執行(將任何合適的字符串到屬性格式化數字):
>>> x='1555-555-5555'
>>> y=(x.translate(allchars, nondigits)).lstrip('1')
>>> assert len(y) == 10
>>> '%s-%s-%s' % (y[:3], y[3:6], y[6:])
'555-555-5555
當然,你需要決定做什麼的時候len(y)
做不是等於10(只是因爲我在這裏做的事情而引發異常,或者其他)。但是,對於任何其他形式的處理(正則表達式或其他)也是如此。 translate
方法真的非常快速和簡單! - )
你可能還想看看北美編號計劃,http://en.wikipedia.org/wiki/NANP。 – jamessan 2009-11-13 18:43:59