Return a dictionary of Regex Matches

An example of how to make your function more flexible to handle a different number of return values. This means you won’t have to write the same code repeatedly if you are only changing the number of groups that are being returned.

def findMatches(string, regex) -> dict:
    """
    This is a generic matching function.
    Warning! Your regex expression MUST use 'Named Groups' -> (:P<name>) or
    this function will return an empty dictionary
    
    :param string: The text you are searching
    :type string: str
    :param regex: The regular expression string you are using to search
    :type regex: str
    :returns: A dictionary of named key/value pairs. The key value is derived \
    from (:P<name>)
    :returns: None is returned if No match is found.
    :rtype: dict
    :rtype: None
    """
    matcher = re.compile(regex, re.UNICODE)
    match = matcher.match(string)
    if match:
        matches = dict()
        for key in match.groupdict():
            matches[key] = match.group(key)
        return matches
    # No Matches
    return None

Decoding Email Header and Contents

import email.parser
from email import policy
def openFromFile(fp) -> email.message.EmailMessage:
"""
Read in the open file pointer
:param fp: file pointer to open file.
:type fp: file pointer
:returns: msg which is an email.message.EmailMessage
:rtype: email.message.EmailMessage
"""
msg = email.parser.Parser(policy=policy.default)
return msg.parse(fp)
def openFromStr(string) -> email.message.EmailMessage:
"""
Read in the email from string.
:param string:
:type string: str
:returns: msg which is an email.message.EmailMessage
:rtype: email.message.EmailMessage
"""
msg = email.parser.Parser(policy=policy.default)
return msg.parsestr(string)

Using email.parser and email.policy along with policy.default means that you do not need to worry about character encoding as the modules will take care of it automatically.

I forget where I saw it but I believe that policy.default will become the real default in the future.
Current policy.compat32 is the module default.

Custom Corporate Holidays with holidays package

I am currently working on a newish personal project. My plan is to create a Python version of a Google Script app that I am running. I wanted to find a way to determine if a given date is a national holiday. This requires taking into account that National Holidays that fall on a Sunday are moved to the following Monday or to Tuesday if Monday is already a National Holiday. I also needed to support adding Company holidays. This is important as it impacts some calculations. Enter the Python package: holidays

[Read More]