- added lookbehind support (?<=pattern), (?<!pattern).

the pattern must have a fixed width.

- got rid of array-module dependencies; the match pro-
  gram is now stored inside the pattern object, rather
  than in an extra string buffer.

- cleaned up a various of potential leaks, api abuses,
  and other minors in the engine module.

- use mal's new isalnum macro, rather than my own work-
  around.

- untabified test_sre.py.  seems like I removed a couple
  of trailing spaces in the process...
This commit is contained in:
Fredrik Lundh 2000-07-03 18:44:21 +00:00
parent 40c48685a2
commit 6f01398236
5 changed files with 138 additions and 104 deletions

View file

@ -10,18 +10,10 @@
# other compatibility work.
#
import array
import _sre
from sre_constants import *
# find an array type code that matches the engine's code size
for WORDSIZE in "Hil":
if len(array.array(WORDSIZE, [0]).tostring()) == _sre.getcodesize():
break
else:
raise RuntimeError, "cannot find a useable array type"
MAXCODE = 65535
def _charset(charset, fixup):
@ -170,7 +162,20 @@ def _compile(code, pattern, flags):
emit((group-1)*2+1)
elif op in (SUCCESS, FAILURE):
emit(OPCODES[op])
elif op in (ASSERT, ASSERT_NOT, CALL):
elif op in (ASSERT, ASSERT_NOT):
emit(OPCODES[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(OPCODES[SUCCESS])
code[skip] = len(code) - skip
elif op is CALL:
emit(OPCODES[op])
skip = len(code); emit(0)
_compile(code, av, flags)
@ -305,7 +310,7 @@ def compile(p, flags=0):
indexgroup[i] = k
return _sre.compile(
pattern, flags,
array.array(WORDSIZE, code).tostring(),
p.pattern.groups-1, groupindex, indexgroup
pattern, flags, code,
p.pattern.groups-1,
groupindex, indexgroup
)