当前位置:嗨网首页>书籍在线阅读

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'

你可以认为?是在说“匹配这个问号之前的分组零次或一次”。

如果需要匹配真正的问号字符,就使用转义字符\?。