Python 正则表达式中可选的第二个单词
我写了以下的正则表达式
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
所以简单来说,第二组应该匹配“White”或者“White House”或者“White House!”
谢谢。
1 个回答
4
这个表达式 ([A-Z][a-z](+\s[A-Z][a-z]+!?)?)
中的第一个 +
放错地方了,应该在括号的另一边。
你可以试试这个表达式 ([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',)