首页 > 解决方案 > 带有可选组的 Python 正则表达式,至少匹配一个

问题描述

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

使用给定的字符串列表

我想提取成3组H,M和S,不知何故

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

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

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

Easyliy 然后我可以按组(1-3)访问 H、M 和 S 组件。我只是想限制匹配以实现标准,即必须触发至少一个选项组,否则它不匹配。否则,我猜这个表达式可以选择为空并且匹配所有内容。

这是示例的链接: https ://regex101.com/r/LKAKbx/5

如何仅从匹配组中获取数字,例如:

时间是 12H 3M 12S

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

或者

12S 准备好

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

标签: pythonregex

解决方案


使用积极的前瞻来确保我们至少有一个H,MS

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)

推荐阅读