2009-11-13 67 views
0

我正在閱讀許多用戶輸入的數據,這些數據表示來自文件的電話號碼。他們在所有不同略有進入:Python代碼接受許多不同格式的美國電話號碼?

 
5555555555 
555-555-5555 
555-555/5555 
1555-555-5555 
etc... 

我怎麼能輕鬆地分析所有的Python這些電話號碼,併產生像一個典型的輸出: 555-555-5555?

+0

你可能還想看看北美編號計劃,http://en.wikipedia.org/wiki/NANP。 – jamessan 2009-11-13 18:43:59

回答

3

只拿數字與一個正則表達式左

  • 插入幾個破折號。然後查明他們是否附加了1(NO區號以1開頭)。如果它在那裏,請將其移除,按照需要格式化10位數字。

    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 
    
  • 6

    我不是美國人,但這適用於俄羅斯的電話號碼......也許它也適用於美國的呢?

    1. 丟棄所有非數字字符
    2. 的數字
    3. 驗證量適當的地方
    9

    深入Python有分析電話號碼的一個部分

    ​​

    +0

    不僅是一個徹底的答案,但注意到即使電話號碼解析時也有特殊情況。 – quark 2009-11-13 18:48:01

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

    或親愛的,'TypeError' – SilentGhost 2009-11-13 18:45:57

    0

    確定要識別哪些格式,然後創建一個正則表達式匹配每一個分組的不同部分數字(如區號,前綴等)。最後使用替代產生你想要的規範輸出。

    實施例:

    匹配

    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個匹配的組,一個用於地區代碼,一個用於前綴,另一個用於後綴,您可以根據需要輸出。你需要對正則表達式有一個基本的理解,但是它不應該太難。

    2

    經過與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方法真的非常快速和簡單! - )

    相關問題