“^(?P <x> \ d?)”和“^(?P <x> \ d)”之间的语义差异是什么?“?</x> </x>

时间:2013-11-10 15:15:37

标签: python regex

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

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

^(?P<x>\d)?

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

^(?P<x>\d?)

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

1 个答案:

答案 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组。