簡體   English   中英

用於匹配電話號碼的 Python 正則表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM