使用 re.findall 避免始终为空的正则表达式组

Avoiding an always-empty regex group with re.findall

我有一个字符串列表列表,正在遍历每个列表以搜索正则表达式模式,该模式使用正则表达式组并生成 3 个组,因此输出在一个 3 元组中,如下所示:

regex = '((:(?:\w+\s)+)?\w+)\[((?:\+|\-)\d)\]'


matches = []

for line in sentences:

    result = re.findall(regex, str(line))
    matches.append(result)

生成以下输出:

[[('very good', '', '+3'), ('good', '', '+2')]]

但是,我不想在列表中输出中间组,如您所见,它始终为空,如何修改正则表达式模式或修改我正在使用的内容以确保只有'very good' 和 '+3'(例如在第一场比赛中)显示为元组 ('very good', '+3') 而不是中间空白元组?

即我希望我的输出是:

[[('very good', '+3'), ('good', '+2')]]

您需要修改模式以仅匹配和捕获必要的内容:

(\w+(?:\s+\w+)*)\[([+-]\d)]

参见regex demo

详情:

  • (\w+(?:\s+\w+)*) - 第 1 组:一个或多个单词字符,然后零次或多次出现一个或多个空格和一个或多个单词字符
  • \[ - 一个 [ 字符
  • ([+-]\d) - 第 2 组:+- 然后是数字
  • ] - 一个 ] 字符。