"""Glob to regular expression conversion."""
import re
import sys
PY_3_7_AND_LATER = bool(tuple(sys.version_info[0:2]) >= (3, 7))
[docs]
def Glob2Regex(glob_pattern):
"""Converts a glob pattern to a regular expression.
This function supports basic glob patterns that consist of:
* matches everything
? matches any single character
[seq] matches any character in sequence
[!seq] matches any character not in sequence
Args:
glob_pattern (str): glob pattern.
Returns:
str: regular expression pattern.
Raises:
ValueError: if the glob pattern cannot be converted.
"""
if not glob_pattern:
raise ValueError("Missing glob pattern.")
regex_pattern = []
glob_pattern_index = 0
glob_pattern_length = len(glob_pattern)
while glob_pattern_index < glob_pattern_length:
character = glob_pattern[glob_pattern_index]
glob_pattern_index += 1
if character == "*":
regex_pattern.append(".*")
elif character == "?":
regex_pattern.append(".")
elif character != "[":
regex_character = re.escape(character)
regex_pattern.append(regex_character)
else:
glob_group_index = glob_pattern_index
if (
glob_group_index < glob_pattern_length
and glob_pattern[glob_group_index] == "!"
):
glob_group_index += 1
if (
glob_group_index < glob_pattern_length
and glob_pattern[glob_group_index] == "]"
):
glob_group_index += 1
while (
glob_group_index < glob_pattern_length
and glob_pattern[glob_group_index] != "]"
):
glob_group_index += 1
if glob_group_index >= glob_pattern_length:
regex_pattern.append("\\[")
continue
glob_group = glob_pattern[glob_pattern_index:glob_group_index]
glob_pattern_index = glob_group_index + 1
glob_group = glob_group.replace("\\", "\\\\")
if PY_3_7_AND_LATER:
glob_group = glob_group.replace("|", "\\|")
regex_pattern.append("[")
if glob_group[0] == "!":
regex_pattern.append("^")
glob_group = glob_group[1:]
elif glob_group[0] == "^":
regex_pattern.append("\\")
regex_pattern.append(glob_group)
regex_pattern.append("]")
return "".join(regex_pattern)