[英]Python regex for matching phone numbers
我是 Python regex 的新手,我需要你的幫助。 我正在使用以下正則表達式來匹配電話號碼:
r'^\s*\(?([0-9]{3})[\)\-][\s]*?([0-9]{3})[-]?([0-9]{4})\s*$'
Apprantly 它確實通過了大多數情況,但它不會使某些格式失敗。 有人可以澄清我做錯了什么嗎? 我猜數字的第一部分中的空格和括號格式有問題。
它應該通過這些格式
'(404) 666-1111'
'(404) 6661111'
'404-666-1111'
'404-6661111'
'404666-1111'
'4046661111'
' (404) 666-1111 '
'(404)666-1111 '
' 404-666-1111 '
' 404-6661111 '
' 4046661111'
並在這些方面失敗:
'+1 (404) 666-1111'
' ( 404)666-1111'
'404.666.1111'
'404 666-1111'
'404 666 1111'
'(404-666-1111'
關鍵的挑戰是確保括號匹配。 鑒於正則表達式不能計算開頭和結尾,執行該部分的常用方法是提供兩種模式替代方案,一種帶括號,另一種不帶:
>>> bool(re.match(r'(\(\d{3}\))|\d{3}', '404'))
True
>>> bool(re.match(r'(\(\d{3}\))|\d{3}', '(404)'))
True
>>> bool(re.match(r'(\(\d{3}\))|\d{3}', '(404'))
False
沒有任何括號或連字符的整數不匹配的原因是因為在模式的開頭,在 3 位數字之后有一個)
或-
預期
^\s*\(?([0-9]{3})[)-]
^^^^
要匹配和不匹配所有示例,您可以使用
^\s*(?:\(\d{3}\)\s*|\d{3})-?\d{3}-?\d{4}\s*$
解釋
^
字符串開始\\s*
匹配 0+ 個空白字符(?:
非捕獲組
\\(\\d{3}\\)\\s*
匹配括號和可選空白字符之間的 3 位數字|
或者\\d{3}
匹配 3 位數字)
關閉群組-?\\d{3}-?
匹配可選連字符之間的 3 位數字\\d{4}\\s*
匹配 4 位數字和可選的空白字符$
字符串結尾請注意, \\s
也可以匹配換行符
你可以做的是擺脫“”然后用“|”做正則表達式這意味着或請注意,這個 RegEx 是不完整的,但想法是您可以添加更多 | 對此:
import re
numbersList=['(404) 666-1111' ,'(404) 6661111', '404-666-1111', '404-6661111' ,'404666-1111', '4046661111', ' (404) 666-1111 ' ,'(404)666-1111 ' ,' 404-666-1111 ', ' 404-6661111 ', ' 4046661111' ]
regExStr="^\(\d{3}\) *\d+\-*\d+|^ *\d+\-\d+|^ *\d+|^ *\(\d{3}\)\d+\-\d+"
for number in numbersList:
tmpStr=number.replace(" ", "")
result = re.findall(regExStr, tmpStr)
print(result)
print("orig: " + number)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.