如何创建带有可选组的正则表达式而不将其与另一个组合并?

问题描述 投票:0回答:1

我正在尝试在 Python 中编写正则表达式模式来捕获两个组,其中第二组是可选的,但我希望这些组保持不同。

以下是我想要匹配的可能模式的示例:

案例1:

1.2.1 Mickey Mouse (3-400-1-Z)

  • 第一组:“米老鼠”
  • 第 2 组:“3-400-1-Z”

在某些情况下,括号及其内容会丢失,即: 案例2:

1.2.1 Mickey Mouse

  • 第一组:“米老鼠”
  • 第 2 组应返回 None

这是我当前的正则表达式:

1\.2\.\d\s+(.*)(?:\s*\((\d+-\d+-\d+-[A-Z])\))

这创建了我想要的组,但如果存在情况 2,则它不匹配。另外,如果我添加一个“?”使第二组可选,它只是将我想要的组合并为一个(即,将

Mickey Mouse (3-400-1-Z)
作为组 1 返回)

那么,如何在 Python 中创建一个正则表达式来正确匹配这两个组,同时保持第 2 组可选且独立于第 1 组?有没有办法让可选组正常工作而不合并到组1?

python regex regex-group python-re
1个回答
0
投票

当您添加“?”时将第二组设置为可选,您的组 1 将尽可能匹配(请参阅Greedy 或 Lazy)。因此,在第 1 组中添加一个“?”这样

(.*?)
就会使其匹配尽可能少。
然后添加
$
进行匹配,直到行尾。

1\.2\.\d\s+(.*?)(?:\s*\((\d+-\d+-\d+-[A-Z])\))?$
© www.soinside.com 2019 - 2024. All rights reserved.