Python正则表达式组中的可选第二个单词

时间:2011-08-22 15:31:27

标签: python regex

我写了以下正则表达式

m = re.match('.+SPELL_DAMAGE,.+,"([A-Z][a-z]+)",.+"([A-Z][a-z]+\s[A-Z][a-z]+!?)",\d+x\d+,(\d+)',line)

我希望第二组基本上说“找一个或两个单词,有时会以感叹号结束。

([A-Z][a-z]+\s[A-Z][a-z]+!?)

现在,正则表达式仅适用于具有两个单词的第二组。我不确定如何在组内使用?正则表达式()

我在考虑([A-Z][a-z](+\s[A-Z][a-z]+!?)?)以使第二个字完全可选,但我收到有关sre_constants.error: nothing to repeat的错误

所以简而言之,第二组应该匹配“白宫”或“白宫”或“白宫!”

感谢。

1 个答案:

答案 0 :(得分:4)

([A-Z][a-z](+\s[A-Z][a-z]+!?)?)第一个+位于parens的错误一侧。

尝试([A-Z][a-z]+(\s[A-Z][a-z]+!?)?)

>>> re.match(r"([A-Z][a-z]+(\s[A-Z][a-z]+!?)?)", "White House").groups()
('White House', ' House')

除此之外:要摆脱毫无意义的“额外词汇”群组,您可以使用非分组括号:(?:...)代替(...)

这样:

>>> re.match(r"([A-Z][a-z]+(?:\s[A-Z][a-z]+!?)?)", "White House").groups()
('White House',)