簡體   English   中英

正則表達式 | 空字符串匹配 | Python 3.4.0

[英]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', '', '', '')]

問題:

  1. 為什么匹配中包含空字符串?
  2. 空字符串從字符串的哪些位置匹配?
  3. 空字符串匹配的條件是什么?

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.

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