Skip to content

Instantly share code, notes, and snippets.

@pyrocat101
Last active December 29, 2015 23:09
Show Gist options
  • Save pyrocat101/7740847 to your computer and use it in GitHub Desktop.
Save pyrocat101/7740847 to your computer and use it in GitHub Desktop.
Glob style wildcard
# -*- coding: utf-8 -*-
def glob(s, p, i=0, j=0, aux=0, star=-1):
"""
>>> glob("aa", "*")
True
>>> glob("aa", "a")
False
>>> glob("aa", "aa")
True
>>> glob("aaa", "aa")
False
>>> glob("aa", "*")
True
>>> glob("aa", "a*")
True
>>> glob("ab", "?*")
True
>>> glob("aab", "c*a*b")
False
>>> glob("aab", "")
False
>>> glob("", "*")
True
>>> glob("", "")
True
>>> glob("a", "")
False
>>> glob("hi", "*?")
True
>>> glob("b", "?*?")
False
>>> glob("aaabbbaabaaaaababaabaaabbabbbbbbbbaabababbabbbaaaaba", "a*******b")
False
>>> glob("abbbaaaaaaaabbbabaaabbabbbaabaabbbbaabaabbabaabbabbaabbbaabaabbabaabaabbbbaabbbaabaaababbbbabaaababbaaa", "ab**b*bb*ab**ab***b*abaa**b*a*aaa**bba*aa*a*abb*a*a")
True
>>> glob("abbaabbbbababaababababbabbbaaaabbbbaaabbbabaabbbbbabbbbabbabbaaabaaaabbbbbbaaabbabbbbababbbaaabbabbabb", "***b**a*a*b***b*a*b*bbb**baa*bba**b**bb***b*a*aab*a**")
True
"""
if isinstance(s, str):
s = list(s)
s.append('\0')
if isinstance(p, str):
p = list(p)
p.append('\0')
if s[i] != '\0':
if p[j] == '?' or s[i] == p[j]:
return glob(s, p, i + 1, j + 1, aux, star)
elif p[j] == '*':
return glob(s, p, i, j + 1, i, j)
elif (star >= 0):
return glob(s, p, aux + 1, star + 1, aux + 1, star)
else:
return False
while p[j] == '*':
j += 1
return p[j] == '\0'
if __name__ == '__main__':
import doctest
doctest.testmod()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment