1

我一直在使用用于从输入字符串中提取信息的长正则表达式,其中某些字段是可选的,我想知道两者之间是否存在实际区别:

  • 描述一个包含组名的可选子表达式:

^(?P<x>\d)?

  • ...并描述包含引用可选表达式的组名的表达式:

^(?P<x>\d?)

我知道它们不是完全相同的表达式,因为前者是可选表达式,而后者是包含可选表达式的非可选表达式,但两个表达式给出相同的结果。有什么我没有看到的区别吗?使用python“re”模块时,它们中的任何一个比另一个更有效吗?

4

1 回答 1

3

让我做你的终端:

Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> re.match("^(?P<x>\d)?(?P<rest>.)", "abc").groupdict()
{'x': None, 'rest': 'a'}
>>> re.match("^(?P<x>\d?)(?P<rest>.)", "abc").groupdict()
{'x': '', 'rest': 'a'}
>>> 

换句话说,(\d?)如果没有数字,总是成功并匹配一个空字符串,而(\d)?失败并返回一个None组。

于 2013-11-10T15:20:26.437 回答