如何重新匹配没有捕获任何东西的组?

时间:2015-05-06 08:54:20

标签: python regex

我试图解析一个字符串,其中某个部分可以包含在"'之间,或者根本不包含在内。但是,我很难找到一个语法,当没有引号时

请参阅以下(简化)示例:

>>> print re.match(r'\w(?P<quote>(\'|"))?\w', 'f"oo').group('quote')
"

>>> print re.match(r'\w(?P<quote>(\'|"))?\w', 'foo').group('quote')
None

>>> print re.match(r'\w(?P<quote>(\'|"))?\w(?P=quote)', 'f"o"o').group('quote')
"

>>> print re.match(r'\w(?P<quote>(\'|"))?\w(?P=quote)', 'foo').group('quote')
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "<string>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
'NoneType' object has no attribute 'group'

上次尝试的所需结果应为None,作为示例中的第二个命令。

1 个答案:

答案 0 :(得分:0)

基于我对另一个问题的建议,我能够产生一个略有不同的正则表达式,提供正确的答案:

>>> re.match(r'\w(?P<quote>[\'"]?)\w(?P=quote)\w', 'foo').group('quote')
u''

>>> re.match(r'\w(?P<quote>[\'"]?)\w(?P=quote)\w', 'f"o"o').group('quote')
u'"'

>>> re.match(r'\w(?P<quote>[\'"]?)\w(?P=quote)\w', 'f\'o\'o').group('quote')
u"'"

诀窍是在匹配的角色上使用量词而不是整个群体

[此示例中的前导和尾随\w仅用于防止正则表达式匹配完整字符串(作为未加引号的字符串)。在实际情况下,这不是必需的,因为这个匹配是更大的正则表达式的一部分,前一组和后一组匹配]。