summaryrefslogtreecommitdiffstats
path: root/Lib/zipfile/_path/glob.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/zipfile/_path/glob.py')
-rw-r--r--Lib/zipfile/_path/glob.py40
1 files changed, 40 insertions, 0 deletions
diff --git a/Lib/zipfile/_path/glob.py b/Lib/zipfile/_path/glob.py
new file mode 100644
index 0000000..4a2e665
--- /dev/null
+++ b/Lib/zipfile/_path/glob.py
@@ -0,0 +1,40 @@
+import re
+
+
+def translate(pattern):
+ r"""
+ Given a glob pattern, produce a regex that matches it.
+
+ >>> translate('*.txt')
+ '[^/]*\\.txt'
+ >>> translate('a?txt')
+ 'a.txt'
+ >>> translate('**/*')
+ '.*/[^/]*'
+ """
+ return ''.join(map(replace, separate(pattern)))
+
+
+def separate(pattern):
+ """
+ Separate out character sets to avoid translating their contents.
+
+ >>> [m.group(0) for m in separate('*.txt')]
+ ['*.txt']
+ >>> [m.group(0) for m in separate('a[?]txt')]
+ ['a', '[?]', 'txt']
+ """
+ return re.finditer(r'([^\[]+)|(?P<set>[\[].*?[\]])|([\[][^\]]*$)', pattern)
+
+
+def replace(match):
+ """
+ Perform the replacements for a match from :func:`separate`.
+ """
+
+ return match.group('set') or (
+ re.escape(match.group(0))
+ .replace('\\*\\*', r'.*')
+ .replace('\\*', r'[^/]*')
+ .replace('\\?', r'.')
+ )