我写了以下正则表达式
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
的错误
所以简而言之,第二组应该匹配“白宫”或“白宫”或“白宫!”
感谢。
答案 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',)