使用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'
你只想找美國的電話號碼?因爲你不會去除其他國家的大部分號碼。 – Ben
@Ben,我正在尋找任何國家的電話號碼(在我的正則表達式中查看'\ d?'國家代碼),'1(123)123-4567'就是一個例子。 –
大多數國家都有2位數的國家代碼(大約3位)。即使您正在查看擁有1位數字代碼的國家,您也無法獲取所有信息。例如,英國的標準國際電話格式是「+44 02D DDDD DDDD」或「+44 0DDDD DDD DDD」(前0是可選的)。你不匹配一件事。法國是'+33 DD DD DD',你也不明白。您已經採用美國格式,並且每個國家都有相同數量的數字。 – Ben