2010-08-14 237 views
2

深入Python給出了一個驚人的小教程創建爲電話號碼的正則表達式:http://diveintopython3.ep.io/regular-expressions.html#phonenumbers電話號碼正則表達式(正則表達式)在Python

最終版本出來的樣子:

phone_re = re.compile(r'(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$', re.VERBOSE) 

這幾乎適用於我可以想到的所有示例,但是我發現了一個很大的故障,我似乎無法修復。

如果一組3位數字出現在電話號碼前面,它可以正常工作。 IE: 「500美元關閉,請致電123-456-7891」

如果一組3位數字出現在電話號碼後面,則失敗。 IE: 「致電123-456-7891可享受高達500的折扣」

有關適用於兩個示例的修復的任何建議?

+6

我總是很驚訝網絡社區中的尊重人士如何給出有缺陷的(即以美國爲中心)建議。這可能是一個很好的學術示例,可以爲正則表達式提供初學者的實用感受,但是您不應該在實際應用中使用它。世界各地的電話號碼都不一樣。 – Tomalak 2010-08-14 19:13:54

+0

更具體地說,如果您從未計劃在除美國以外的任何地方使用您的應用程序,則應僅在應用程序中使用它。 – Amber 2010-08-14 19:14:31

+4

甚至沒有,因爲不是每個人都可能像他們應該格式化一個電話號碼。 – Joey 2010-08-14 19:16:11

回答

1

(\d*)$要求您匹配的字符串以數字字符結尾($表示「行尾」)。嘗試刪除$,如果您匹配的電話號碼可能不在該行末尾的較大字符串。

0

這是你的原創,有一些空間(使用re.VERBOSE,或空格去掉):

(\d{3}) \D* (\d{3}) \D* (\d{4}) \D* (\d*) 

\D*將匹配任何不是一個數字,包括文字。也許你應該試試這個:

(\d{3}) \W* (\d{3}) \W* (\d{4}) \W* (\d*) 

\W*匹配任何不是一個字。它將匹配(222) - 222 - 2222。但是,如果數字之間存在字母,它將不匹配,如(222) x 222 - 2222。比賽的最後一部分(\d*)似乎在尋找延伸。這些可以通過多種方式進行格式化—我建議您根據您希望數據的外觀來刪除它或對其進行優化。而且,就像安伯說的那樣,你應該放棄$