Skip to main content

A library which extends regex with support for datetime format codes.

Project description

datetime-matcher 📆←💬

PyPI PyPI - Status PyPI - Python Version PyPI - License

datetime-matcher is python module that enables an extension of regex which allows matching, extracting, and reformatting stringified datetimes.

It does so by providing an interface eerily similar to python's native re module.

It's mighty useful for doing things like bulk-renaming files with datetimes in their filenames. But don't let us tell you what it's good for—give it a try yourself!

Quick Links

Getting Started

Install it from pypi by running

pip install datetime-matcher

Then, get it into your code by importing and instantiating

from datetime_matcher import DatetimeMatcher
dtm = DatetimeMatcher()

Finally, run your data through it to perform subsitutions (or any of our many other supported operations!)

oh_my_would_you_look_at_the_time = [
  'TheWallClock_1982-Feb-27.jpeg',
  'TheWristWatch_2003-Aug-11.jpg',
  'TheSmartWatch_2020-Mar-10.jpeg',
]

pattern = r'(\w+)_%Y-%b-%d\.jpe?g'
replace = r'%Y%m%d-\1.jpg'

its_all_clear_now = dtm.sub(pattern, replace, text) for text in oh_my_would_you_look_at_the_time

assert its_all_clear_now[0] == '19820227-TheWallClock.jpg'
assert its_all_clear_now[1] == '20030811-TheWristWatch.jpg'
assert its_all_clear_now[2] == '20200310-TheSmartWatch.jpg'

Example

Use Case in String Substitution with Datetime Reformatting

Let's say we have several filenames of the following format that we want to rename:

'MyLovelyPicture_2020-Mar-10.jpeg'

We want to change them to look like this string:

'20200310-MyLovelyPicture.jpg'

The Unclean Way to Do It, without datetime-matcher

Using the standard library re.sub, we run into an issue:

text = 'MyLovelyPicture_2020-Mar-10.jpeg'

pattern = r'(\w+)_([0-9]{4}-\w{3}-[0-9]{2})\.jpe?g' # ❌ messy
replace = r'(??????)-\1.jpg'                        # ❌ what do we put for ??????

result = re.sub(pattern, replace, text)             # ❌ This does't work

We have to manually run datetime.strptime with a custom parser string to extract the date, and then manually insert it back into the replacement string before running a non-generic search-and-replace using the customized replacement string.

Yuck.

The Clean Way to Do It, with datetime-matcher

We can do the following for a quick and easy substitution with reformatting.

from datetime_matcher import DatetimeMatcher
dtmatcher = DatetimeMatcher()

text = 'MyLovelyPicture_2020-Mar-10.jpeg'

pattern = r'(\w+)_%Y-%b-%d\.jpe?g'              # ✅ regex + strptime
replace = r'%Y%m%d-\1.jpg'                      # ✅ template + strftime

result = dtmatcher.sub(pattern, replace, text)  # ✅ magical substitution

assert result == '20200310-MyLovelyPicture.jpg' # ✅ This works like a charm

Dfregex Syntax Informal Spec

The syntax for dfregex is nearly identical to that of conventional python regex. There is only one addition and one alteration to support datetime format codes. This is far from a formal spec, but expect that currently supported syntaxes, within the current major semantic version, will NOT be removed unless provided reasonable notification and a generous deprecation period.

The Datetime Format Codes

The percentage character indicates the beginning of a datetime format code. These codes are the standard C-style ones used in the built-in datetime module for strftime.

For a list of standard codes, see the Python docs.

Minus the exceptions below, and barring platform-specific support, strftime.org is a good alternative list.

NOTE: The following codes are currently not supported: %Z, %c, %x, %X

The Percent Literal (%)

The percentage literal in conventional regex (%) must be escaped in dfregex (\%) because an unescaped one marks the beginning of a datetime format code and otherwise would be ambiguous.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

datetime_matcher-0.4.0.tar.gz (13.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

datetime_matcher-0.4.0-py3-none-any.whl (11.0 kB view details)

Uploaded Python 3

File details

Details for the file datetime_matcher-0.4.0.tar.gz.

File metadata

  • Download URL: datetime_matcher-0.4.0.tar.gz
  • Upload date:
  • Size: 13.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for datetime_matcher-0.4.0.tar.gz
Algorithm Hash digest
SHA256 0407e214a2b2d1d1cca73a9ac90dd19e99e3eb57e6dd697a94863aaa9a90fd98
MD5 d362db310c69253b701875ef97b8498c
BLAKE2b-256 c07189a20c984975e488c332bc07fbdd9544e5183020a0eb06222aa5e4285766

See more details on using hashes here.

Provenance

The following attestation bundles were made for datetime_matcher-0.4.0.tar.gz:

Publisher: publish.yml on stephen-zhao/datetime_matcher

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file datetime_matcher-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for datetime_matcher-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c87e7d7d202e6046784cd95e70fa7ddff7f8d639bb4c335849604fdf5c58f6b5
MD5 0a2f81c6d316d4df56b0f123af368d3c
BLAKE2b-256 db9cef002cd2bf0a96080dc73cc5977d1b442a502d8c6a08e792f1b8251f85df

See more details on using hashes here.

Provenance

The following attestation bundles were made for datetime_matcher-0.4.0-py3-none-any.whl:

Publisher: publish.yml on stephen-zhao/datetime_matcher

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page