Date

表示是否匹配

可以用来表示某个字符是否匹配

>>> print a
a123b123b
>>> print re.match(r"a0", a)
None
>>> print re.match(r"a0?", a)
<_sre.SRE_Match object at 0x100578780>
>>> print re.match(r"a0?", a).group()
a

也可以用来表示某个组是否匹配

>>> print a
a123b123b
>>> print re.match(r"a(1234)", a)
None
>>> print re.match(r"a(1234)?", a)
<_sre.SRE_Match object at 0x1005d0eb8>
>>> print re.match(r"a(1234)?", a)

表示非贪婪匹配

跟在星号后面:

>>> print a
a123b123b
>>> re.match(r"a.*b", a).group()
'a123b123b'
>>> re.match(r"a.*?b", a).group()
'a123b'

跟在加号后面:

>>> print a
a123b123b
>>> print re.match(r"a[1-3]+", a).group()
a123
>>> print re.match(r"a[1-3]+?", a).group()
a1

跟在大括号后面:

>>> print a
a123b123b
>>> print re.match(r"a[1-3]{2,3}", a).group()
a123
>>> print re.match(r"a[1-3]{2,3}?", a).group()
a12

注意:

如果你在使用sed测试非贪婪匹配的方式,如果不生效请不要奇怪。因为linux sed是不支持非贪婪匹配这种方式的,不管是否启用正则扩展(即打开-r/-E选项,CentOS是-r,Mac是-E)。

其实,如果是在python中,问号在正则中还有其他含义,比如下面的这种用法:

>>> print a
a123b123b
>>> print re.match(r"a(123)?", a).groups()
('123',)
>>> print re.match(r"a(?:123)?", a).groups()
()

这一块扩展开来,涉及到的内容较多,下次专门整理一篇文章。