diff options
Diffstat (limited to 'Lib/fnmatch.py')
-rw-r--r-- | Lib/fnmatch.py | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/Lib/fnmatch.py b/Lib/fnmatch.py index fd3b5142e3..b98e641329 100644 --- a/Lib/fnmatch.py +++ b/Lib/fnmatch.py @@ -97,11 +97,30 @@ def translate(pat): if j >= n: res = res + '\\[' else: - stuff = pat[i:j].replace('\\','\\\\') + stuff = pat[i:j] + if '--' not in stuff: + stuff = stuff.replace('\\', r'\\') + else: + chunks = [] + k = i+2 if pat[i] == '!' else i+1 + while True: + k = pat.find('-', k, j) + if k < 0: + break + chunks.append(pat[i:k]) + i = k+1 + k = k+3 + chunks.append(pat[i:j]) + # Escape backslashes and hyphens for set difference (--). + # Hyphens that create ranges shouldn't be escaped. + stuff = '-'.join(s.replace('\\', r'\\').replace('-', r'\-') + for s in chunks) + # Escape set operations (&&, ~~ and ||). + stuff = re.sub(r'([&~|])', r'\\\1', stuff) i = j+1 if stuff[0] == '!': stuff = '^' + stuff[1:] - elif stuff[0] == '^': + elif stuff[0] in ('^', '['): stuff = '\\' + stuff res = '%s[%s]' % (res, stuff) else: |