我知道这是一个非常简单的问题。我碰巧看了一个正则表达式的例子。
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?'
时,相同的字符串会匹配。我不知道这里有什么不同。有人可以解释一下吗?
答案 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
。