Python 为什么在正则表达式中使用问号字面量

Python 为什么在正则表达式中使用问号字面量

介绍

问号使得正则表达式中的前一个标记变为可选项。例如:colou?r可以匹配colour和color。问号被称为量词。

可以通过在括号中组合多个标记,并在最后一组括号后加上问号来使多个标记变为可选项。例如: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(): re.findall(pattern, string)方法查找所有模式并返回所有匹配子字符串的列表。

第一个参数是正则表达式模式”aa[cde]?”。字符串to Be checked for patterns是第二个参数。简单地说,你在寻找
以两个a字符和一个可选字符开始的模式可能是’c’, ‘d’或’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消耗匹配的子字符串后,剩下的子字符串是”aadcde”。另外,字符串”aa”也符合模式。它被Python消耗后,只剩下子字符串”aadcde”。第三个是在最后一个子字符串中的模式匹配到字符串”aad”。剩下的是”cde”,它不再有匹配的子字符串。

查看正则表达式引擎内部

我们将正则表达式colou?r应用到字符串中。指挥官喜欢绿色。

正则表达式中字面上的c是第一个标记。在指挥官中的c是第一个正确匹配的地方。引擎继续运行,发现l匹配l,另一个o匹配o,以及另一个o也匹配o。然后,引擎确定u和n是否相等。它失败了。然而,问号告诉正则表达式引擎可以省略字符u。因此,引擎继续处理下一个正则表达式标记r。然而,r也无法匹配n。现在,引擎只能得出这样的结论:完成的正则表达式,从指挥官中的c开始,无法匹配到第一个o。引擎重新启动。

在一系列失败后,o、l和o匹配后面的字符,而c匹配到颜色的c。引擎现在确定u和r是否匹配。它失败了。但没有问题。因为有问号,引擎可以继续处理r。引擎声明在我们的文本中匹配到了正则表达式中的颜色,因为它匹配到了r。

结论

当应用于正则表达式A时,Python的A?量词匹配A的零个或一个实例。例如,正则表达式”hey?”可以匹配字符串”he”和”hey”,但不能匹配空字符串。这是因为?量词仅应用于它之前的正则表达式,即’y’,而不是整个正则表达式’, hey’。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程