为什么我们在 Python 正则表达式中使用问号字面量?
简介
问号使 正则表达式 中的前一个标记可选。例如:colou?r 同时兼容 colour 和 colour。问号被称为量词。
您可以通过将多个标记组合在括号中并在最后一个括号组后添加问号来使多个标记可选。例如 Nov(ember)? 匹配 Nov 和 November。
使用多个问号,您可以创建一个匹配各种选项的正则表达式。Feb(ruary)? 23(rd)? 匹配 February 23rd、February 23、Feb 23rd 和 Feb 23。
花括号也可以用来使某些内容可选。colou?r 的等价形式是 colou{0,1}r。POSIX BRE 和 GNU BRE 彼此不兼容。花括号需要反斜杠来表达以下风格的特定含义:colou\{0,1\}r
重要的正则表达式概念:贪婪
本课程介绍的第一个贪婪元字符是问号。正则表达式引擎对于问号有两个选择:尝试匹配问号所指的部分,或者不尝试匹配它。引擎总是尝试匹配该部分。除非这导致整个正则表达式失败,否则引擎不会尝试忽略问号适用的部分。
因此,当正则表达式 Feb 23(rd)? 应用于文本 Today is Feb 23, 2003 时,匹配结果始终是 Feb 23rd,而不是 Feb 23。通过在第一个问号之后再添加一个问号,您可以使问号变为懒惰(即关闭贪婪)。
使用的语法
re.findall(): The re.findall(pattern, string) method finds all pattern occurrences in the string and returns a list of all matching substrings. The first parameter is the regular expression pattern "aa[cde]?". The string to be checked for patterns is the second parameter. Simply put, you're looking for patterns that begin with two 'a' characters and one optional character that might be a 'c', 'd', or 'e.
示例
#importing re functions import re #findall function to result1 = re.findall('aa[cde]?', 'aacde aa aadcde') #The re.findall(pattern, string) method finds all pattern occurrences in the string and returns a list of all matching substrings. result2 = re.findall('aa?', 'accccacccac') result3 = re.findall('[cd]?[cde]?', 'ccc dd ee') #printing the results print(result1) print(result2) print(result3)
输出
['aac', 'aa', 'aad'] ['a', 'a', 'a'] ['cc', 'c', '', 'dd', '', 'e', 'e', '']
代码解释
findall() 方法返回三个匹配的子字符串 -
首先,模式与字符串 "aac" 匹配。在 Python 消耗匹配的子字符串后,剩余的字符串为 "de aa aadcde"。此外,字符串 "aa" 符合模式。Python 消耗它,只留下子字符串 "aadcde"。第三,最后一个子字符串中的模式与字符串 "aad" 匹配。剩下的部分是 "cde",它不再有匹配的子字符串。
深入正则表达式引擎
让我们将正则表达式 colou?r 应用于字符串。The colonel likes the colour green。
正则表达式中的第一个标记是字面量 c。它在 colonel 中的第一个 c 处首次成功匹配。引擎继续运行,发现 l 匹配 l,另一个 o 匹配 o,o 匹配 o。然后引擎检查 u 和 n 是否相等。它失败了。但是,问号指示正则表达式引擎允许缺少字符 u。因此,引擎继续到下一个正则表达式标记 r。但是,这也没有匹配 n。现在,引擎只能得出结论,从 colonel 中的 c 开始的完整正则表达式无法匹配。为了匹配 c 与 colonel 中的第一个 o,引擎重新开始。
在一系列失败之后,o、l 和 o 匹配接下来的字符,c 匹配 colour 中的 c。引擎现在检查 u 和 r 是否匹配。它失败了。再次,没有问题。由于问号的存在,引擎可以继续处理 r。引擎声明正则表达式在我们的文本中成功匹配了 colour,因为它匹配了 r。
结论
在正则表达式 A 中应用 Python 的 A? 量词时,它会匹配 A 的零个或一个实例。例如,正则表达式 "hey?" 匹配字符串 "he" 和 "hey",但不匹配空字符串 "."。这是因为 ? 量词仅适用于它前面的正则表达式 'y',而不是整个正则表达式 ', hey'。