10-用问号实现可选匹配
7.3.3 用问号实现可选匹配
有时候,想匹配的模式是可选的。就是说,不论这段文本在不在,正则表达式都会认为匹配。字符?表明它前面的分组在这个模式中是可选的。例如,在交互式环境中输入以下代码:
>>> batRegex = re.compile(r'Bat(wo)?man')
>>> mo1 = batRegex.search('The Adventures of Batman')
>>> mo1.group()
'Batman'
>>> mo2 = batRegex.search('The Adventures of Batwoman')
>>> mo2.group()
'Batwoman'
正则表达式中的 (wo)?
部分表明模式 wo
是可选的分组。在该正则表达式匹配的文本中, wo
将出现零次或一次。这就是为什么正则表达式既匹配 'Batwoman'
,又匹配 'Batman'
。
利用前面电话号码的例子,你可以让正则表达式寻找包含区号或不包含区号的电话号码。在交互式环境中输入以下代码:
>>> phoneRegex = re.compile(r'(\d\d\d-)?\d\d\d-\d\d\d\d')
>>> mo1 = phoneRegex.search('My number is 415-555-4242')
>>> mo1.group()
'415-555-4242'
>>> mo2 = phoneRegex.search('My number is 555-4242')
>>> mo2.group()
'555-4242'
你可以认为?是在说“匹配这个问号之前的分组零次或一次”。
如果需要匹配真正的问号字符,就使用转义字符\?。