我一直在处理长正则表达式,用于从输入字符串中提取信息,其中某些字段是可选的,我想知道是否存在实际差异:
^(?P<x>\d)?
^(?P<x>\d?)
我知道它们不是完全相同的表达式,因为前者是可选表达式,而后者是包含可选表达式的非可选表达式,但两个表达式都给出相同的结果。我没有看到有什么不同吗?当使用python“re”模块时,它们中的任何一个都比其他更有效吗?
答案 0 :(得分: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
组。