2014-02-15 76 views
0

我用下面的正則表達式來查找文本電話號碼(號碼可有或無國家代碼,用不同的分離器等):如何用X代替電話號碼?

phonePattern = re.compile(".*?\d?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?", re.S) 
result = phonePattern.search(text) 

現在我想用兩個X來代替數字。例如,如果我找到像1 (123) 123-4567這樣的電話,則應在文中用1 (XXX) XXX-XXXX代替。我該怎麼做?

+0

你只想找美國的電話號碼?因爲你不會去除其他國家的大部分號碼。 – Ben

+0

@Ben,我正在尋找任何國家的電話號碼(在我的正則表達式中查看'\ d?'國家代碼),'1(123)123-4567'就是一個例子。 –

+0

大多數國家都有2位數的國家代碼(大約3位)。即使您正在查看擁有1位數字代碼的國家,您也無法獲取所有信息。例如,英國的標準國際電話格式是「+44 02D DDDD DDDD」或「+44 0DDDD DDD DDD」(前0是可選的)。你不匹配一件事。法國是'+33 DD DD DD',你也不明白。您已經採用美國格式,並且每個國家都有相同數量的數字。 – Ben

回答

2

使用phonePattern.sub()電話,但下降的.*?開始和結束(那些在這裏沒有必要反正):

phonePattern = re.compile("\d?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4})") 
result = phonePattern.sub(lambda m: re.sub('\d', 'X', m.group(1)), text) 

沒有.*?模式re.S標誌可以得下降。領先的\d?在這裏相當多餘;在該數字和(字符之間沒有空格,但它肯定與您的示例模式不匹配。

對於找到的每一場比賽,一個lambda函數被調用,以提供一個替代品,它只是簡單地採用分組文本(m.group(1)),並與X字符替換所有數字。

演示:

>>> import re 
>>> text = 'Here is a phone number: 1 (123) 123-4567' 
>>> phonePattern = re.compile("\d?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4})", re.S) 
>>> phonePattern.sub(lambda m: re.sub('\d', 'X', m.group(1)), text) 
'Here is a phone number: 1 (XXX) XXX-XXXX' 
+0

're.S'也變得多餘了,最後,'\ d?'在開始時似乎沒有做任何事情,至少不會在後面沒有空間的情況下。 – Jerry

+0

@Jerry:事實上,它也可以在這裏被丟棄。 –

+0

謝謝@MartijnPieters。演示失去了國家代碼(另一個例子'1(123)1234567'),但我認爲對我而言確實如此。 –

0
import re 
phone = "1 (123) 123-4567" 
replaced_phone = phone[0] + re.sub("\d", "X", phone[1:]) # 1 (XXX) XXX-XXXX