mirror of
https://github.com/python/cpython.git
synced 2025-08-11 04:19:06 +00:00

gh-106752: Sync with zipp 3.16.2 (GH-106757)
* gh-106752: Sync with zipp 3.16.2
* Add blurb
(cherry picked from commit 22980dc7c9
)
Co-authored-by: Jason R. Coombs <jaraco@jaraco.com>
40 lines
893 B
Python
40 lines
893 B
Python
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'.')
|
|
)
|