Python正则表达式处理"?"

时间:2016-02-23 10:17:26

标签: python regex

我知道这是一个非常简单的问题。我碰巧看了一个正则表达式的例子。

import re
pattern = r'^M?M?M?$'

s = "MDM"

re.search(pattern, s)

我可以知道为什么它与字符串s不匹配吗? AFAIK,?指定0或1出现。它与MMM相匹配。

但是,当模式为r'M?M?M?$'r'^M?M?M?'时,相同的字符串会匹配。我不知道这里有什么不同。有人可以解释一下吗?

3 个答案:

答案 0 :(得分:2)

r'^M?M?M?$'r'^M{0,3}$'相同。因此,您的模式接受'', 'M', 'MM', 'MMM'个字符串。

r'M?M?M?$'r'M{0,3}$相同,实际上,它接受所有字符串,因为字符串末尾总是有一个空的部分:

In [21]: pattern = r'M?M?M?$'

In [22]: re.search(pattern, 'A string without capital m at all')
Out[22]: <_sre.SRE_Match object; span=(33, 33), match=''>

答案 1 :(得分:1)

正则表达式

M?M?M?$

匹配最后一个&#34; M&#34;在&#34; MDM&#34;。但是当你添加^(字符串的开头)时,它会尝试从头开始匹配并且它会失败,因为M?匹配0或1&#34; M&#34 ;但不是&#34; D&#34;。

另一个正则表达式:

^M?M?M?

第一个&#34; M&#34;匹配。

答案 2 :(得分:1)

^匹配一行的开头。 $匹配该行的结尾。

所以'M?M?M?$'M中的最后MDM匹配,而'^M?M?M?'M中的第一个MDM匹配。

'^M?M?M?$'无法与MDM匹配,因为中间的D未在您的正则表达式中列出,并且要求匹配行的开头和行的结尾中间有0,1,2或3 M