diff --git a/docs/source/gatheredfilter.rst b/docs/source/gatheredfilter.rst index fdd93592f..e4da8c5d5 100644 --- a/docs/source/gatheredfilter.rst +++ b/docs/source/gatheredfilter.rst @@ -125,6 +125,31 @@ These all do the same thing, listed from fastest to slowest. gathered_filter: 'name matches-regex .*?' +Example - Matching a Regex +-------------------------- + +It is possible to write regex in the following formats; + +* Standard regex in single quotation marks(`'`) +* Escaped backslash in double quotation marks(`"`) +* Using folded block scalar followed by a dash (`>-`) without any quotation marks + +See examples below which correspond to the same regex: + +.. code-block:: yaml + + gathered_filter: 'name matches-regex \sPAN\s' + +.. code-block:: yaml + + gathered_filter: "name matches-regex \\sPAN\\s" + +.. code-block:: yaml + + gathered_filter: >- + name matches-regex \sPAN\s + + Example - Matching a Suffix --------------------------- diff --git a/plugins/module_utils/panos.py b/plugins/module_utils/panos.py index 8bce488b0..216d6efb7 100644 --- a/plugins/module_utils/panos.py +++ b/plugins/module_utils/panos.py @@ -1200,6 +1200,18 @@ def _get_default_value(self, obj, key): return default_value + def _shlex_split(self, logic): + """Split string using shlex.split without escape char + + Escape char '\' is removed from shlex class to correctly process regex. + """ + lex = shlex.shlex(logic, posix=True) + lex.whitespace_split = True + lex.commenters = "" + lex.escape = "" + + return list(lex) + def matches_gathered_filter(self, item, logic): """Returns True if the item and its contents matches the logic given. @@ -1223,7 +1235,7 @@ def matches_gathered_filter(self, item, logic): evaler = [] pdepth = 0 - logic_tokens = shlex.split(logic) + logic_tokens = self._shlex_split(logic) token_iter = iter(logic_tokens) while True: end_parens = 0