Python “之间的语义区别是什么?”^(?P<;x>;\d?)”;及^(?P<;x>;\d)?”;?

Python “之间的语义区别是什么?”^(?P<;x>;\d?)”;及^(?P<;x>;\d)?”;?,python,regex,Python,Regex,我一直在使用长正则表达式从输入字符串中提取信息,其中一些字段是可选的,我想知道以下字段之间是否存在实际差异: 描述包含组名的可选子表达式: ^(?p\d)? 。。。并描述一个表达式,其中包含引用可选表达式的组名: ^(?p\d? 我知道它们不是完全相同的表达式,因为前者是可选表达式,而后者是包含可选表达式的非可选表达式,但两个表达式给出相同的结果。我看不出有什么不同吗?在使用python“re”模块时,它们中的任何一个是否比另一个更有效?让我来做你的终端: Python 2.7.1 (r

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

  • 描述包含组名的可选子表达式:
^(?p\d)?

  • 。。。并描述一个表达式,其中包含引用可选表达式的组名:
^(?p\d?


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

让我来做你的终端:

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'}
>>> 
Python2.7.1(r271:868321911年7月31日19:30:53)
[GCC 4.2.1(基于苹果公司5658版本)(LLVM版本2335.15.00)]关于达尔文
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>进口稀土
>>>关于匹配(^(?P\d)(?P.),“abc”).groupdict()
{'x':无,'rest':'a'}
>>>关于match(^(?P\d?(“P”),“abc”).groupdict()
{'x':''rest':'a'}
>>> 

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

我只想获取匹配的值,因此此差异意味着我必须检查字典条目在第一种情况下是否为None,或者我是否必须检查字典条目是否为空字符串。我应该假设第一种方法更有效吗?@PabloFranciscoPérezHidalgo:是的,可选组应该更有效,因为引擎不会浪费时间创建空组。