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

1 投票
1 回答
1148 浏览
提问于 2025-04-17 00:07

我写了以下的正则表达式

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',)

撰写回答