RegexGroups

Extraction of elements which are contained in all the subgroups of the match to the pattern. For example, extracting from the string "The quick brown fox" the object `{"article":"The","noun":quick"}` (See arguments descriptions for more details).

python · Filters And Transformers

Source

import demistomock as demisto  # noqa: F401
from CommonServerPython import *  # noqa: F401


def get_regex_matches(args):
    match_target = args["value"]
    capture_groups = args.get("groups")
    dict_keys = args.get("keys")
    regex_flags = 0
    for flag in argToList(args.get("flags", "")):
        if flag in ("dotall", "s"):
            regex_flags |= re.DOTALL
        elif flag in ("multiline", "m"):
            regex_flags |= re.MULTILINE
        elif flag in ("ignorecase", "i"):
            regex_flags |= re.IGNORECASE
        elif flag in ("unicode", "u"):
            regex_flags |= re.UNICODE
        else:
            raise ValueError(f"Unknown flag: {flag}")
    regex_pattern = re.compile(r"{}".format(args["regex"]), regex_flags)
    if capture_groups:
        capture_groups = capture_groups.split(",")
        # Validating groups input to be integers
        if not all(x.isdigit() for x in capture_groups):
            raise ValueError("Error: groups must be integers")

    if dict_keys:
        dict_keys = dict_keys.split(",")

    pattern_match = re.search(regex_pattern, match_target)
    matches = []
    if pattern_match:
        for i in pattern_match.groups():
            matches.append(i)

    if capture_groups and matches:
        for j in capture_groups:
            if len(matches) - 1 < int(j):
                raise ValueError("Error: Regex group (" + j + ") out of range")
        matches = [matches[int(x)] for x in capture_groups]

    if dict_keys:
        if len(dict_keys) != len(matches):
            raise ValueError("Error: Number of keys does not match number of items")
        else:
            dict_matches = dict(zip(dict_keys, matches))
            return dict_matches
    return matches


def main():
    matches: str | list = []
    args = demisto.args()
    try:
        matches = get_regex_matches(args)
    except Exception as e:
        demisto.error(f"Error in RegexGroups script: {e!s}")
    finally:
        # empty list is not supported
        if not matches:
            matches = ""
        return_results(matches)


if __name__ in ("__builtin__", "builtins"):
    main()