使用Python正则表达式在表达式中可选地匹配?

时间:2014-09-08 17:35:20

标签: python regex

我编写了以下正则表达式,以便在命令行中匹配人类可读的时间:

^(?:(?:(?:(\d+)d\s*)?(\d+)h\s*)?(\d+)m\s*)?(\d+)s$

使用非捕获字符串,此正则表达式匹配"人类可读"时间同样适用于以下格式:

1d 2h 3m 4s
1h 2m 3s
1m 2s
1s

...和...

1d2h3m4s
1h2m3s
1m2s
1s

在此正则表达式中,如果我包含minutes值,我还必须包含seconds值。即,我不能简单地提供15m1d3m,我必须提供15m0s1d0h3m0s

是否可以扩展正则表达式以匹配后两个用例?怎么样? 请注意:我不一定要寻找插入式解决方案,但我们会非常感谢正确方向的指针。

更新

只是我做了一段时间的简短更新 - 这是Python中的正则表达式。

4 个答案:

答案 0 :(得分:2)

您可以使用此模式:

\A(?=\S)(?:\d+d)?(?:\h*\d+h)?(?:\h*\d+m)?(?:\h*\d+s)?\z

方法是使所有元素都是可选的。开头的前瞻确保至少有一个不是空格的角色。 (换句话说,它确保至少有一个元素)

答案 1 :(得分:2)

相反,保持正则表达式并尝试调整它我会建议大大简化你的正则表达式:

/ *(\d+)([dhms])/gm

RegEx Demo

正如您所看到的,它匹配您当前和建议的所有字符串。然后,您可以在代码中对两个捕获的组进行后处理。

答案 2 :(得分:1)

你的秒文件不是可选的。没有?在它之后。所有不包含s的字段都会失败。

参见演示。

http://regex101.com/r/iX5xR2/28

我已经申请了问号。

答案 3 :(得分:0)

您可以使用嵌套组:

/^(?:(?:(?:(\d+)d\s*)?(\d+)h\s*)?(\d+)m\s*)?(\d+)s$/g

dhms的值分别为1,2,3和4组。

Here is a regex demo