import re
import demistomock as demisto
from CommonServerPython import *
LETTER_TO_REGEX_FLAGS = {
"i": re.IGNORECASE,
"m": re.MULTILINE,
"s": re.DOTALL,
"u": re.UNICODE,
}
def parse_regex_flags(raw_flags: str = "gim"):
"""
parse flags user input and convert them to re flags.
Args:
raw_flags: string chars representing er flags
Returns:
(re flags, whether to return multiple matches)
"""
raw_flags = raw_flags.lstrip("-") # compatibility with original MatchRegex script.
multiple_matches = "g" in raw_flags
raw_flags = raw_flags.replace("g", "")
flags = re.RegexFlag(0)
for c in raw_flags:
if c in LETTER_TO_REGEX_FLAGS:
flags |= LETTER_TO_REGEX_FLAGS[c]
else:
raise ValueError(f'Invalid regex flag "{c}".\nSupported flags are {", ".join(LETTER_TO_REGEX_FLAGS.keys())}')
return flags, multiple_matches
def main(args: dict):
data: str = args.get("data") # type: ignore[assignment]
raw_regex = args.get("regex", "")
group = int(args.get("group", "0"))
context_key = args.get("contextKey", "")
flags, multiple_matches = parse_regex_flags(args.get("flags", "gim"))
regex = re.compile(raw_regex, flags=flags)
# in case group is out of range, fallback to all matching string
if group > regex.groups:
group = 0
results = []
if multiple_matches:
regex_result = regex.search(data)
while regex_result:
results.append(regex_result.group(group))
regex_result = regex.search(data, regex_result.span()[1])
else:
regex_result = regex.search(data)
if regex_result:
results = regex_result.group(group) # type: ignore[assignment]
results = results[0] if len(results) == 1 else results
human_readable = json.dumps(results) if results else "Regex does not match."
context = {}
if context_key:
context = {context_key: results}
# clearing the context field in order to override it instead of appending it.
demisto.setContext("MatchRegex.results", results)
return CommandResults(
readable_output=human_readable,
outputs=context,
raw_response=results,
)
if __name__ in ("__main__", "__builtin__", "builtins"):
try:
return_results(main(demisto.args()))
except Exception as exc:
return_error(str(exc), error=exc)
README
Extracts regex data from a given text. This supports groups and looping as well.
Script Data
Name
Description
Script Type
python3
Tags
Utility
Inputs
Argument Name
Description
data
The text date to extract the regex from.
regex
The regex to match and extract. Take into account that data taken from context data contains special characters which are not visible, such as \n and \b.
group
The matching group to return. If nothing is provided the full match will be returned. The group value should start at 1.