def _gen(d, limit=20, count=False): """docstring for _gen""" ret = [''] strings = 0 for i in d: if i[0] == 'in': subs = _in(i[1]) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'literal': ret = mappend(ret, chr(i[1])) elif i[0] == 'category': subs = CATEGORIES.get(i[1], ['']) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'any': subs = CATEGORIES['category_any'] if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'max_repeat': chars = filter(None, _gen(list(i[1][2]), limit)) if i[1][1]+1 - i[1][0] >= limit: ran = range(i[1][0], i[1][0]+limit) else: ran = range(i[1][0], i[1][1]+1) if count: for i in ran: strings += pow(len(chars), i) ret = prods(ret, ran, chars) elif i[0] == 'branch': subs = list(chain.from_iterable(_gen(list(x), limit) for x in i[1][1])) if count: strings = (strings or 1) * (len(subs) or 1) ret = comb(ret, subs) elif i[0] == 'subpattern': if count: strings = (strings or 1) * (sum(ggen([0], _gen, i[1][1], limit=limit, count=True)) or 1) ret = ggen(ret, _gen, i[1][1], limit=limit, count=False) # ignore ^ and $ elif i[0] == 'at': continue elif i[0] == 'not_literal': subs = list(CATEGORIES['category_any']) subs.remove(chr(i[1])) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'assert': print i[1][1] continue else: print('[!] cannot handle expression ' + repr(i)) if count: return strings return ret
def _gen(d, limit=20, count=False): """docstring for _gen""" ret = [''] strings = 0 for i in d: if i[0] == 'in': subs = _in(i[1]) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'literal': ret = mappend(ret, chr(i[1])) elif i[0] == 'category': subs = CATEGORIES.get(i[1], ['']) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'any': subs = CATEGORIES['category_any'] if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'max_repeat': chars = filter(None, _gen(list(i[1][2]), limit)) if i[1][1]+1 - i[1][0] > limit: ran = range(i[1][0], i[1][0]+limit) else: ran = range(i[1][0], i[1][1]+1) if count: for i in ran: strings += pow(len(chars), i) ret = prods(ret, ran, chars) elif i[0] == 'branch': subs = list(chain.from_iterable(_gen(list(x), limit) for x in i[1][1])) if count: strings = (strings or 1) * (len(subs) or 1) ret = comb(ret, subs) elif i[0] == 'subpattern': if count: strings = (strings or 1) * (sum(ggen([0], _gen, i[1][1], limit=limit, count=True)) or 1) ret = ggen(ret, _gen, i[1][1], limit=limit, count=False) # ignore ^ and $ elif i[0] == 'at': continue elif i[0] == 'not_literal': subs = list(CATEGORIES['category_any']) subs.remove(chr(i[1])) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'assert': print i[1][1] continue else: print('[!] cannot handle expression ' + repr(i)) if count: return strings return ret
def _gen(d, limit=20, count=False): """docstring for _p""" ret = [''] params = [] strings = 0 for i in d: if i[0] == 'in': subs = _in(i[1]) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'literal': ret = mappend(ret, chr(i[1])) elif i[0] == 'category': subs = CATEGORIES.get(i[1], ['']) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'any': subs = CATEGORIES['category_any'] if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'max_repeat': chars = filter(None, _gen(list(i[1][2]), limit)) if i[1][1]+1 - i[1][0] > limit: ran = range(i[1][0], i[1][0]+limit) else: ran = range(i[1][0], i[1][1]+1) if count: for i in ran: strings += pow(len(chars), i) ret = prods(ret, ran, chars) elif i[0] == 'branch': subs = chain.from_iterable(_gen(list(x), limit) for x in i[1][1]) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'subpattern': l = i[1:] subs = list(chain.from_iterable(_gen(list(x[1]), limit) for x in l)) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) else: print('[!] cannot handle expression "%r"' % i) if count: return strings return ret
def _randone(d, limit=20): """docstring for _randone""" ret = '' for i in d: if i[0] == 'in': ret += choice(_in(i[1])) elif i[0] == 'literal': ret += chr(i[1]) elif i[0] == 'category': ret += choice(CATEGORIES.get(i[1], [''])) elif i[0] == 'any': ret += choice(CATEGORIES['category_any']) elif i[0] == 'max_repeat': chars = filter(None, _gen(list(i[1][2]), limit)) if i[1][1]+1 - i[1][0] >= limit: min,max = i[1][0], i[1][0]+limit else: min,max = i[1][0], i[1][1] for _ in range(randint(min, max)): ret += choice(chars) elif i[0] == 'branch': ret += choice(list(chain.from_iterable(_gen(list(x), limit) for x in i[1][1]))) elif i[0] == 'subpattern': ret += _randone(i[1][1], limit) elif i[0] == 'at': continue elif i[0] == 'not_literal': c=list(CATEGORIES['category_any']) c.remove(chr(i[1])) ret += choice(c) else: print('[!] cannot handle expression "%s"' % str(i)) return ret
def _randone(d, limit=20): """docstring for _randone""" ret = '' for i in d: if i[0] == 'in': ret += choice(_in(i[1])) elif i[0] == 'literal': ret += chr(i[1]) elif i[0] == 'category': ret += choice(CATEGORIES.get(i[1], [''])) elif i[0] == 'any': ret += choice(CATEGORIES['category_any']) elif i[0] == 'max_repeat': chars = filter(None, _gen(list(i[1][2]), limit)) if i[1][1]+1 - i[1][0] > limit: min,max = i[1][0], i[1][0]+limit else: min,max = i[1][0], i[1][1] for _ in range(randint(min, max)): ret += choice(chars) elif i[0] == 'branch': ret += choice(list(chain.from_iterable(_gen(list(x), limit) for x in i[1][1]))) elif i[0] == 'subpattern': ret += _randone(i[1][1], limit) elif i[0] == 'at': continue elif i[0] == 'not_literal': c=list(CATEGORIES['category_any']) c.remove(chr(i[1])) ret += choice(c) else: print('[!] cannot handle expression "%s"' % str(i)) return ret
def check_vector_field(m, n): test = moose.Neutral('/test') tabs = [] for ii in range(m): comp = moose.Compartment('/test/comp_%d' % (ii), n=n) for jj in range(n): tab = moose.Table('/test/data_%d_%d' % (ii, jj)) moose.connect(tab, 'requestOut', comp.vec[jj], 'getVm') tabs.append(tab) moose.setClock(0, 1e-3) moose.setClock(1, 1e-3) moose.setClock(2, 1e-3) moose.useClock(0, '/##[ISA=Compartment]', 'init') moose.useClock(1, '/##[ISA=Compartment]', 'process') moose.useClock(2, '/##[ISA=Table]', 'process') moose.reinit() moose.start(0.01) return tabs
def prods(orig, ran, items, limit, grouprefs): for o in orig: for r in ran: if r == 0: yield o else: ret = [o] for _ in range(r): ret = ggen(ret, _gen, items, limit=limit, count=False, grouprefs=grouprefs) for i in ret: yield i
def _in(d): ret = [] for i in d: if i[0] == 'range': ret.extend(map(chr, range(i[1][0], i[1][1]+1))) elif i[0] == 'literal': ret.append(chr(i[1])) elif i[0] == 'category': subs = CATEGORIES.get(i[1], ['']) ret.extend(subs) return ret
def allocate_large_vecs(m, n): """Allocate m vecs with n elements each""" test = moose.Neutral('/test') ret = [] for jj, mclass in zip(range(m), cycle(classes)): eval_str = 'moose.vec(path="%s/%s_%d", n=%d, dtype="%s")' % ( test.path, mclass, jj, n, mclass) mobj = eval(eval_str) print('Created', mobj.path) ret.append(mobj) return ret
def allocate_large_vecs(m, n): """Allocate m vecs with n elements each""" test = moose.Neutral('/test') ret = [] for jj, mclass in zip(range(m), cycle(classes)): eval_str = 'moose.vec(path="%s/%s_%d", n=%d, dtype="%s")' % (test.path, mclass, jj, n, mclass) mobj = eval(eval_str) print('Created', mobj.path) ret.append(mobj) return ret
def _randone(d, limit=20, grouprefs=None, args=None): if grouprefs is None: grouprefs = {} """docstring for _randone""" ret = '' for i in d: if i[0] == sre_parse.IN: ret += choice(_in(i[1], args)) elif i[0] == sre_parse.LITERAL: ret += unichr(i[1]) elif i[0] == sre_parse.CATEGORY: if args and args.has(i[1]): ret += args.get_arg() else: ret += choice(CATEGORIES.get(i[1], [''])) elif i[0] == sre_parse.ANY: ret += choice(CATEGORIES['category_any']) elif i[0] == sre_parse.MAX_REPEAT: if i[1][1] + 1 - i[1][0] >= limit: min, max = i[1][0], i[1][0] + limit else: min, max = i[1][0], i[1][1] for _ in range(randint(min, max)): ret += _randone(list(i[1][2]), limit, grouprefs, args) elif i[0] == sre_parse.BRANCH: ret += _randone(choice(i[1][1]), limit, grouprefs, args) elif i[0] == sre_parse.SUBPATTERN: subp = _randone(i[1][1], limit, grouprefs, args=args) if i[1][0]: grouprefs[i[1][0]] = subp ret += subp elif i[0] == sre_parse.AT: continue elif i[0] == sre_parse.NOT_LITERAL: c = list(CATEGORIES['category_any']) if unichr(i[1]) in c: c.remove(unichr(i[1])) ret += choice(c) elif i[0] == sre_parse.GROUPREF: ret += grouprefs[i[1]] elif i[0] == sre_parse.ASSERT: pass elif i[0] == sre_parse.ASSERT_NOT: pass else: print('[!] cannot handle expression "%s"' % str(i)) return ret
def _randone(d, limit=20, grouprefs=None): if grouprefs is None: grouprefs = {} """docstring for _randone""" ret = '' for i in d: if i[0] == sre_parse.IN: ret += choice(_in(i[1])) elif i[0] == sre_parse.LITERAL: ret += unichr(i[1]) elif i[0] == sre_parse.CATEGORY: ret += choice(CATEGORIES.get(i[1], [''])) elif i[0] == sre_parse.ANY: ret += choice(CATEGORIES['category_any']) elif i[0] == sre_parse.MAX_REPEAT or i[0] == sre_parse.MIN_REPEAT: if i[1][1] + 1 - i[1][0] >= limit: min, max = i[1][0], i[1][0] + limit - 1 else: min, max = i[1][0], i[1][1] for _ in range(randint(min, max)): ret += _randone(list(i[1][2]), limit, grouprefs) elif i[0] == sre_parse.BRANCH: ret += _randone(choice(i[1][1]), limit, grouprefs) elif i[0] == sre_parse.SUBPATTERN or i[0] == sre_parse.ASSERT: subexpr = i[1][1] if IS_PY36_OR_GREATER and i[0] == sre_parse.SUBPATTERN: subexpr = i[1][3] subp = _randone(subexpr, limit, grouprefs) if i[1][0]: grouprefs[i[1][0]] = subp ret += subp elif i[0] == sre_parse.AT: continue elif i[0] == sre_parse.NOT_LITERAL: c = list(CATEGORIES['category_any']) if unichr(i[1]) in c: c.remove(unichr(i[1])) ret += choice(c) elif i[0] == sre_parse.GROUPREF: ret += grouprefs[i[1]] elif i[0] == sre_parse.ASSERT_NOT: pass else: print('[!] cannot handle expression "%s"' % str(i)) return ret
def _randone(d, limit=20, grouprefs=None): if grouprefs == None: grouprefs = {} """docstring for _randone""" ret = '' for i in d: if i[0] == 'in': ret += choice(_in(i[1])) elif i[0] == 'literal': ret += unichr(i[1]) elif i[0] == 'category': ret += choice(CATEGORIES.get(i[1], [''])) elif i[0] == 'any': ret += choice(CATEGORIES['category_any']) elif i[0] == 'max_repeat': if i[1][1]+1 - i[1][0] >= limit: min,max = i[1][0], i[1][0]+limit else: min,max = i[1][0], i[1][1] for _ in range(randint(min, max)): ret += _randone(list(i[1][2]), limit, grouprefs) elif i[0] == 'branch': ret += _randone(choice(i[1][1]), limit, grouprefs) elif i[0] == 'subpattern': subp = _randone(i[1][1], limit, grouprefs) if i[1][0]: grouprefs[i[1][0]] = subp ret += subp elif i[0] == 'at': continue elif i[0] == 'not_literal': c=list(CATEGORIES['category_any']) c.remove(unichr(i[1])) ret += choice(c) elif i[0] == 'groupref': ret += grouprefs[i[1]] elif i[0] == 'assert': pass elif i[0] == 'assert_not': pass else: print('[!] cannot handle expression "%s"' % str(i)) return ret
def _in(d, args=None): ret = [] neg = False for i in d: if i[0] == sre_parse.RANGE: subs = map(unichr, range(i[1][0], i[1][1] + 1)) if neg: for char in subs: try: ret.remove(char) except: pass else: ret.extend(subs) elif i[0] == sre_parse.LITERAL: if neg: try: ret.remove(unichr(i[1])) except: pass else: ret.append(unichr(i[1])) elif i[0] == sre_parse.CATEGORY: if args and args.has(i[1]): return [args.get_arg()] else: subs = CATEGORIES.get(i[1], ['']) if neg: for char in subs: try: ret.remove(char) except: pass else: if args is None: ret.extend(subs) elif i[0] == sre_parse.NEGATE: ret = list(CATEGORIES['category_any']) neg = True return ret
def _in(d): ret = [] neg = False for i in d: if i[0] == sre_parse.RANGE: subs = map(unichr, range(i[1][0], i[1][1] + 1)) if neg: for char in subs: try: ret.remove(char) except: pass else: ret.extend(subs) elif i[0] == sre_parse.LITERAL: if neg: try: ret.remove(unichr(i[1])) except: pass else: ret.append(unichr(i[1])) elif i[0] == sre_parse.CATEGORY: subs = CATEGORIES.get(i[1], [""]) if neg: for char in subs: try: ret.remove(char) except: pass else: ret.extend(subs) elif i[0] == sre_parse.NEGATE: ret = list(CATEGORIES["category_any"]) neg = True return ret
def _in(d): ret = [] neg = False for i in d: if i[0] == 'range': subs = map(unichr, range(i[1][0], i[1][1]+1)) if neg: for char in subs: try: ret.remove(char) except: pass else: ret.extend(subs) elif i[0] == 'literal': if neg: try: ret.remove(unichr(i[1])) except: pass else: ret.append(unichr(i[1])) elif i[0] == 'category': subs = CATEGORIES.get(i[1], ['']) if neg: for char in subs: try: ret.remove(char) except: pass else: ret.extend(subs) elif i[0] == 'negate': ret = list(CATEGORIES['category_any']) neg = True return ret
def _in(d): ret = [] neg = False for i in d: if i[0] == 'range': subs = map(chr, range(i[1][0], i[1][1] + 1)) if neg: for char in subs: try: ret.remove(char) except: pass else: ret.extend(subs) elif i[0] == 'literal': if neg: try: ret.remove(chr(i[1])) except: pass else: ret.append(chr(i[1])) elif i[0] == 'category': subs = CATEGORIES.get(i[1], ['']) if neg: for char in subs: try: ret.remove(char) except: pass else: ret.extend(subs) elif i[0] == 'negate': ret = list(CATEGORIES['category_any']) neg = True return ret
def _gen(d, limit=20, count=False, grouprefs=None): """docstring for _gen""" if grouprefs == None: grouprefs = {} ret = [''] strings = 0 literal = False for i in d: if i[0] == 'in': subs = _in(i[1]) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'literal': literal = True ret = mappend(ret, unichr(i[1])) elif i[0] == 'category': subs = CATEGORIES.get(i[1], ['']) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'any': subs = CATEGORIES['category_any'] if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'max_repeat': items = list(i[1][2]) if i[1][1]+1 - i[1][0] >= limit: ran = range(i[1][0], i[1][0]+limit) r1 = i[1][0] r2 = i[1][0]+limit else: r1 = i[1][0] r2 = i[1][1]+1 ran = range(r1, r2) if count: for p in ran: strings += pow(_gen(items, limit, True,grouprefs), p) or 1 ret = prods(ret, ran, items, limit, grouprefs) elif i[0] == 'branch': if count: for x in i[1][1]: strings += _gen(x, limit, True,grouprefs) ret = concit(ret, i[1][1], limit, grouprefs) elif i[0] == 'subpattern': if count: strings = (strings or 1) * (sum(ggen([0], _gen, i[1][1], limit=limit, count=True, grouprefs=grouprefs)) or 1) ret = ggen(ret, _gen, i[1][1], limit=limit, count=False, grouprefs=grouprefs, groupref=i[1][0]) # ignore ^ and $ elif i[0] == 'at': continue elif i[0] == 'not_literal': subs = list(CATEGORIES['category_any']) subs.remove(unichr(i[1])) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == 'groupref': ret = dappend(ret, grouprefs, i[1]) elif i[0] == 'assert': #print(i[1][1]) #continue pass elif i[0] == 'assert_not': pass else: print('[!] cannot handle expression ' + repr(i)) if count: if strings == 0 and literal: inc = True for i in d: if i[0] not in ('at' 'literal'): inc = False if inc: strings = 1 return strings return ret
def _gen(d, limit=20, count=False, grouprefs=None): """docstring for _gen""" if grouprefs == None: grouprefs = {} ret = [""] strings = 0 literal = False for i in d: if i[0] == sre_parse.IN: subs = _in(i[1]) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == sre_parse.LITERAL: literal = True ret = mappend(ret, unichr(i[1])) elif i[0] == sre_parse.CATEGORY: subs = CATEGORIES.get(i[1], [""]) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == sre_parse.ANY: subs = CATEGORIES["category_any"] if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == sre_parse.MAX_REPEAT: items = list(i[1][2]) if i[1][1] + 1 - i[1][0] >= limit: ran = range(i[1][0], i[1][0] + limit) r1 = i[1][0] r2 = i[1][0] + limit else: r1 = i[1][0] r2 = i[1][1] + 1 ran = range(r1, r2) if count: for p in ran: strings += pow(_gen(items, limit, True, grouprefs), p) or 1 ret = prods(ret, ran, items, limit, grouprefs) elif i[0] == sre_parse.BRANCH: if count: for x in i[1][1]: strings += _gen(x, limit, True, grouprefs) ret = concit(ret, i[1][1], limit, grouprefs) elif i[0] == sre_parse.SUBPATTERN: if count: strings = (strings or 1) * ( sum(ggen([0], _gen, i[1][1], limit=limit, count=True, grouprefs=grouprefs)) or 1 ) ret = ggen(ret, _gen, i[1][1], limit=limit, count=False, grouprefs=grouprefs, groupref=i[1][0]) # ignore ^ and $ elif i[0] == sre_parse.AT: continue elif i[0] == sre_parse.NOT_LITERAL: subs = list(CATEGORIES["category_any"]) subs.remove(unichr(i[1])) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == sre_parse.GROUPREF: ret = dappend(ret, grouprefs, i[1]) elif i[0] == sre_parse.ASSERT: # print(i[1][1]) # continue pass elif i[0] == sre_parse.ASSERT_NOT: pass else: print("[!] cannot handle expression " + repr(i)) if count: if strings == 0 and literal: inc = True for i in d: if i[0] not in (sre_parse.AT, sre_parse.LITERAL): inc = False if inc: strings = 1 return strings return ret
tabs.append(tab) moose.setClock(0, 1e-3) moose.setClock(1, 1e-3) moose.setClock(2, 1e-3) moose.useClock(0, '/##[ISA=Compartment]', 'init') moose.useClock(1, '/##[ISA=Compartment]', 'process') moose.useClock(2, '/##[ISA=Table]', 'process') moose.reinit() moose.start(0.01) return tabs import numpy as np if __name__ == '__main__': np_arrays = [] for ii in range(3): print('Creating elements') allocate_large_vecs(100, 100) print('Created elements. Creating field dict now') create_finfos() moose.delete(moose.element('/test')) tabs = check_vector_field(100, 100) for t in tabs: np_arrays.append(np.array(t.vec)) moose.delete('/test') print('Finished') # # test_gc.py ends here
from random import choice, randint from types import GeneratorType from sys import version_info IS_PY3 = version_info[0] == 3 if IS_PY3: unichr = chr __all__ = ("generate", "CATEGORIES", "count", "parse", "getone", "sre_to_string", "simplify") CATEGORIES = { sre_parse.CATEGORY_SPACE: sorted(sre_parse.WHITESPACE), sre_parse.CATEGORY_DIGIT: sorted(sre_parse.DIGITS), "category_any": [unichr(x) for x in range(32, 123)], } def _build_reverse_categories(): reverse = {} for key, value in sre_parse.CATEGORIES.items(): if not hasattr(value[1], "__iter__"): continue for vv in value[1]: if value[0] == sre_parse.IN and vv[0] == sre_parse.CATEGORY: reverse.update({vv[1]: key}) return reverse
unichr = chr __all__ = ( 'generate', 'CATEGORIES', 'count', 'parse', 'getone', 'sre_to_string', 'simplify' ) CATEGORIES = { sre_parse.CATEGORY_SPACE: sorted(sre_parse.WHITESPACE), sre_parse.CATEGORY_DIGIT: sorted(sre_parse.DIGITS), sre_parse.CATEGORY_WORD: [unichr(x) for x in range(256) if match('\w', unichr(x), U)], sre_parse.CATEGORY_NOT_WORD: [unichr(x) for x in range(256) if match('\W', unichr(x), U)], 'category_any': [unichr(x) for x in range(32, 123)] } def _build_reverse_categories(): reverse = {} for key, value in sre_parse.CATEGORIES.items(): if not hasattr(value[1], '__iter__'): continue for vv in value[1]: if value[0] == sre_parse.IN and vv[0] == sre_parse.CATEGORY:
from sys import version_info IS_PY3 = version_info[0] == 3 if IS_PY3: unichr = chr __all__ = ('generate', 'CATEGORIES', 'count', 'parse', 'getone', 'sre_to_string', 'simplify') CATEGORIES = {'category_space': sorted(sre_parse.WHITESPACE), 'category_digit': sorted(sre_parse.DIGITS), 'category_any': [unichr(x) for x in range(32, 123)] } # REVERSE_CATEGORIES = {vv[1]:k for k,v # in sre_parse.CATEGORIES.items() for vv # in v[1] # if v[0] == 'in' and vv[0] == 'category'} def comb(g, i): for c in g: g2, i = tee(i) for c2 in g2: yield c + c2
try: from future_builtins import map, range except: pass from re import match, sre_parse from itertools import product, chain, tee from random import choice, randint import string __all__ = ('generate', 'CATEGORIES', 'count', 'parse', 'getone') CATEGORIES = { 'category_space': sorted(sre_parse.WHITESPACE), 'category_digit': sorted(sre_parse.DIGITS), 'category_not_digit': [chr(x) for x in range(32, 123) if match('\D', chr(x))], 'category_any': [chr(x) for x in range(32, 123)], 'category_word': sorted(frozenset(string.ascii_letters + string.digits + "_")), 'category_not_word': [chr(x) for x in range(32, 123) if match('\W', chr(x))] } def comb(g, i): for c in g: g2, i = tee(i) for c2 in g2: yield c + c2
from types import GeneratorType from sys import version_info IS_PY3 = version_info[0] == 3 IS_PY36_OR_GREATER = IS_PY3 and version_info[1] > 5 if IS_PY3: unichr = chr __all__ = ('generate', 'CATEGORIES', 'count', 'parse', 'getone', 'sre_to_string', 'simplify') CATEGORIES = { sre_parse.CATEGORY_SPACE: sorted(sre_parse.WHITESPACE), sre_parse.CATEGORY_DIGIT: sorted(sre_parse.DIGITS), 'category_any': [unichr(x) for x in range(32, 123)] } def _build_reverse_categories(): reverse = {} for key, value in sre_parse.CATEGORIES.items(): if not hasattr(value[1], '__iter__'): continue for vv in value[1]: if value[0] == sre_parse.IN and vv[0] == sre_parse.CATEGORY: reverse.update({vv[1]: key}) return reverse
IS_PY3 = version_info[0] == 3 if IS_PY3: unichr = chr __all__ = ('generate', 'CATEGORIES', 'count', 'parse', 'getone', 'sre_to_string', 'simplify') CATEGORIES = {'category_space' : sorted(sre_parse.WHITESPACE) ,'category_digit' : sorted(sre_parse.DIGITS) ,'category_any' : [unichr(x) for x in range(32, 123)] } REVERSE_CATEGORIES = {vv[1]:k for k,v in sre_parse.CATEGORIES.items() for vv in v[1] if v[0] == 'in' and vv[0] == 'category'} def comb(g, i): for c in g: g2,i = tee(i) for c2 in g2: yield c+c2
IS_PY3 = version_info[0] == 3 IS_PY36_OR_GREATER = IS_PY3 and version_info[1] > 5 if IS_PY3: unichr = chr __all__ = ('generate', 'CATEGORIES', 'count', 'parse', 'getone', 'sre_to_string', 'simplify') CATEGORIES = { sre_parse.CATEGORY_SPACE: sorted(sre_parse.WHITESPACE), sre_parse.CATEGORY_DIGIT: sorted(sre_parse.DIGITS), sre_parse.CATEGORY_WORD: [unichr(x) for x in range(128) if match('\w', unichr(x), U)], sre_parse.CATEGORY_NOT_WORD: [unichr(x) for x in range(128) if match('\W', unichr(x), U)], 'category_any': [unichr(x) for x in range(32, 123)] } def _build_reverse_categories(): reverse = {} for key, value in sre_parse.CATEGORIES.items(): if not hasattr(value[1], '__iter__'): continue for vv in value[1]: if value[0] == sre_parse.IN and vv[0] == sre_parse.CATEGORY: reverse.update({vv[1]: key})
def _gen(d, limit=20, count=False, grouprefs=None): """docstring for _gen""" if grouprefs is None: grouprefs = {} ret = [''] strings = 0 literal = False for i in d: if i[0] == sre_parse.IN: subs = _in(i[1]) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == sre_parse.LITERAL: literal = True ret = mappend(ret, unichr(i[1])) elif i[0] == sre_parse.CATEGORY: subs = CATEGORIES.get(i[1], ['']) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == sre_parse.ANY: subs = CATEGORIES['category_any'] if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == sre_parse.MAX_REPEAT: items = list(i[1][2]) if i[1][1] + 1 - i[1][0] >= limit: ran = range(i[1][0], i[1][0] + limit) r1 = i[1][0] r2 = i[1][0] + limit else: r1 = i[1][0] r2 = i[1][1] + 1 ran = range(r1, r2) if count: for p in ran: strings += pow(_gen(items, limit, True, grouprefs), p) or 1 ret = prods(ret, ran, items, limit, grouprefs) elif i[0] == sre_parse.BRANCH: if count: for x in i[1][1]: strings += _gen(x, limit, True, grouprefs) or 1 ret = concit(ret, i[1][1], limit, grouprefs) elif i[0] == sre_parse.SUBPATTERN or i[0] == sre_parse.ASSERT: subexpr = i[1][1] if IS_PY36_OR_GREATER and i[0] == sre_parse.SUBPATTERN: subexpr = i[1][3] if count: strings = (strings or 1) * (sum( ggen([0], _gen, subexpr, limit=limit, count=True, grouprefs=grouprefs)) or 1) ret = ggen(ret, _gen, subexpr, limit=limit, count=False, grouprefs=grouprefs, groupref=i[1][0]) # ignore ^ and $ elif i[0] == sre_parse.AT: continue elif i[0] == sre_parse.NOT_LITERAL: subs = list(CATEGORIES['category_any']) if unichr(i[1]) in subs: subs.remove(unichr(i[1])) if count: strings = (strings or 1) * len(subs) ret = comb(ret, subs) elif i[0] == sre_parse.GROUPREF: ret = dappend(ret, grouprefs, i[1]) elif i[0] == sre_parse.ASSERT_NOT: pass else: print('[!] cannot handle expression ' + repr(i)) if count: if strings == 0 and literal: inc = True for i in d: if i[0] not in (sre_parse.AT, sre_parse.LITERAL): inc = False if inc: strings = 1 return strings return ret