[英]Regex | Empty String match | Python 3.4.0
我的代碼:
import re
#Phone Number regex
phoneRegex = re.compile(r'''(
(\d{3}|\(\d{3}\))?
(\s|-|\.)? # separator
(\d{3}) # first 3 digits
(\s|-|\.) # separator
(\d{4}) # last 4 digits
(\s*(ext|x|ext.)\s*(\d{2,5}))? # extension
)''', re.VERBOSE)
phoneRegex.findall('Phone: 800.420.7240 or +1 415.863.9900 (9 a.m. to 5 p.m., M-F, PST)')
Output:
[('800.420.7240', '800', '.', '420', '.', '7240', '', '', ''), ('415.863.9900', '415', '.', '863', '.', '9900', '', '', '')]
問題:
PS當我在https://regex101.com/上使用相同的正則表達式時,匹配中不包含空字符串
另外,我幾天前才開始學習正則表達式,所以如果我的問題不夠好,我很抱歉。
?
運算符表示它將返回零個或一個匹配項。 在這種情況下,您使用 ? 使一些捕獲組成為可選的?
, 和 python 為您創建的三個可選捕獲組中的每一個返回一個零長度匹配項。
如果刪除前兩個?
您將消除一些零長度匹配。 要處理最后一個,您需要更改擴展模式。 它占兩個,再次因為您使用零或一個運算符 ( *
)。
如果您不關心內部捕獲組並且只想要完整匹配,您可以過濾掉零長度匹配,例如
>>> [match.group(0) for match in phoneRegex.finditer('Phone: 800.420.7240 or +1 415.863.9900 (9 a.m. to 5 p.m., M-F, PST)')]
['800.420.7240', '415.863.9900']
您可以根據前面的電話號碼匹配條件來使擴展捕獲組匹配。 另外,我認為您可能需要逃避.
在第三個備選ext.
. 正如所寫,它匹配任何字符,但我認為你的意思是ext\.
.
以供參考:
為什么匹配中包含空字符串? 因為您在正則表達式中使用了各種組。 引擎會捕獲您已放入組中的匹配部分。
空字符串從字符串的哪些位置匹配? 從這個正則表達式: (\s*(ext|x|ext.)\s*(\d{2,5}))?
它有三組(你可以數左括號)。 引擎找不到與擴展名匹配的內容,並且嘗試捕獲信息的 3 個組返回空字符串。
空字符串匹配的條件是什么? 如果您以引擎在匹配的字符串中捕獲空 substring 的方式對正則表達式進行分組,它將返回空字符串:-)
我認為您正在遵循“使用 python 自動化無聊的東西”的練習。 在第 178 頁的 VERBOSE 模式下的正則表達式中,嘗試查找左括號。 右括號在哪里? 組的數量與左括號的數量相等。 整個正則表達式是組號為零。
如果要提取匹配字符串的某些部分,組很有用。 如果您只想提取完整的電話號碼,請遠離群組。
你可以試試這個:
phoneRegex = re.compile(r'\d{3}[\.|-|\/]\d{3}[\.|-|\/]\d{4}')
這是你想要達到的目標嗎?
如果您想在 VERBOSE 模式下堅持使用您的正則表達式,您也可以使用非捕獲組。 這僅捕獲完整匹配:
phoneRegex = re.compile(r'''(
(?:\d{3}|\(?:\d{3}\))?
(?:\s|-|\.)? # separator
(?:\d{3}) # first 3 digits
(?:\s|-|\.) # separator
(?:\d{4}) # last 4 digits
(?:\s*(?:ext|x|ext.)\s*(?:\d{2,5}))? # extension
)''', re.VERBOSE)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.