Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matching optionally in expression with Python regex?

Tags:

python

regex

I have written the following regex to match human-readable time at the command-line:

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

Using non-capturing strings, this regex matches "human-readable" time equally-well in the following formats:

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

...and...

1d2h3m4s
1h2m3s
1m2s
1s

In this regex, if I include a minutes value, I also have to include a seconds value. I.e., I can't simply provide 15m or 1d3m, I have to provide 15m0s or 1d0h3m0s.

Is it possible to extend a regex to match these latter two use cases? How? Please note: I'm not necessarily looking for a drop-in solution, but a pointer in the right direction would be greatly appreciated.

Update

Just a brief update that I made awhile back - this is for regex in Python.

like image 646
Deacon Avatar asked Sep 04 '26 14:09

Deacon


2 Answers

You can use this pattern:

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

The approach is to make all element optional. The lookahead at the begining ensures that there is at least a character that is not a space. (in other words, it ensures that there is at least one element)

like image 180
Casimir et Hippolyte Avatar answered Sep 07 '26 03:09

Casimir et Hippolyte


Rather that maintaining that regular expression and trying to tweak it I would suggest greatly simplifying your regex to this:

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

RegEx Demo

As you can see it matches all your current and proposed strings. You can then post-process both captured groups in your code.

like image 22
anubhava Avatar answered Sep 07 '26 04:09

anubhava



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!