带可选组的Python正则表达式,至少一个匹配项

带可选组的Python正则表达式,至少一个匹配项,python,regex,Python,Regex,所以我想我可以用给定的字符串快速地执行re.match(),但我被卡住了 使用给定的字符串列表 时间是12小时3米12秒 时间是3米12秒 它是12小时3米 12秒后准备好 时间是6小时 我想把它分成3组,H,M和S (?:(\d{1,2})H) (?:(\d{1,2})M) (?:(\d{1,2})S) 很容易,我就可以按组(1-3)访问H、M和S组件。我只是想限制比赛,以满足信条,至少有一个选项组必须被触发,否则它就不匹配。否则这个表达式可以选择为空,并且匹配所有内容,我猜 下面是指向该

所以我想我可以用给定的字符串快速地执行re.match(),但我被卡住了

使用给定的字符串列表

  • 时间是12小时3米12秒
  • 时间是3米12秒
  • 它是12小时3米
  • 12秒后准备好
  • 时间是6小时
我想把它分成3组,H,M和S

(?:(\d{1,2})H)

(?:(\d{1,2})M)

(?:(\d{1,2})S)

很容易,我就可以按组(1-3)访问H、M和S组件。我只是想限制比赛,以满足信条,至少有一个选项组必须被触发,否则它就不匹配。否则这个表达式可以选择为空,并且匹配所有内容,我猜

下面是指向该示例的链接:

我怎样才能从match中以组的形式获取数字,例如:

时间是12小时3米12秒

第(1)组=12,第(2)组=3,第(3)组=12

12秒后准备好

第(1)组=无,第(2)组=无,第(3)组=12


使用正向前瞻确保我们至少有一个
H
M
S

import re

strings = [
    'The Time is 12H 3M 12S',
    'The Time is 3M 12S',
    'It is 12H 3M',
    'Ready in 12S',
    'The Time is 6H',
]

for s in strings:
    res = re.search(r'(?= \d{1,2}[HMS])(?: (\d{1,2})H)?(?: (\d{1,2})M)?(?: (\d{1,2})S)?', s)
    #          here __^^^^^^^^^^^^^^^^^
    print(res.groups())
输出:

('12', '3', '12')
(None, '3', '12')
('12', '3', None)
(None, None, '12')
('6', None, None)

你的问题是什么?正是我想要的!