final 0.9.8 updates:

-- added REPEAT_ONE operator
-- added ANY_ALL operator (used to represent "(?s).")
diff --git a/Lib/sre.py b/Lib/sre.py
index 3e125a7..edfefc1 100644
--- a/Lib/sre.py
+++ b/Lib/sre.py
@@ -98,7 +98,10 @@
         return _cache[key]
     except KeyError:
         pass
-    p = sre_compile.compile(pattern, flags)
+    try:
+        p = sre_compile.compile(pattern, flags)
+    except error, v:
+        raise error, v # invalid expression
     if len(_cache) >= _MAXCACHE:
         _cache.clear()
     _cache[key] = p
diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py
index 8fdcecf..abd619e 100644
--- a/Lib/sre_compile.py
+++ b/Lib/sre_compile.py
@@ -73,6 +73,13 @@
         return out
     return charset
 
+def _simple(av):
+    # check if av is a "simple" operator
+    lo, hi = av[2].getwidth()
+    if lo == 0:
+        raise error, "nothing to repeat"
+    return lo == hi == 1 and av[2][0][0] != SUBPATTERN
+
 def _compile(code, pattern, flags):
     # internal: compile a (sub)pattern
     emit = code.append
@@ -116,10 +123,9 @@
             code[skip] = len(code) - skip
         elif op is ANY:
             if flags & SRE_FLAG_DOTALL:
-                emit(OPCODES[op])
+                emit(OPCODES[ANY_ALL])
             else:
-                emit(OPCODES[CATEGORY])
-                emit(CHCODES[CATEGORY_NOT_LINEBREAK])
+                emit(OPCODES[ANY])
         elif op in (REPEAT, MIN_REPEAT, MAX_REPEAT):
             if flags & SRE_FLAG_TEMPLATE:
                 raise error, "internal: unsupported template operator"
@@ -130,30 +136,25 @@
                 _compile(code, av[2], flags)
                 emit(OPCODES[SUCCESS])
                 code[skip] = len(code) - skip
+            elif _simple(av) and op == MAX_REPEAT:
+                emit(OPCODES[REPEAT_ONE])
+                skip = len(code); emit(0)
+                emit(av[0])
+                emit(av[1])
+                _compile(code, av[2], flags)
+                emit(OPCODES[SUCCESS])
+                code[skip] = len(code) - skip
             else:
-                lo, hi = av[2].getwidth()
-                if lo == 0:
-                    raise error, "nothing to repeat"
-                if 0 and lo == hi == 1 and op is MAX_REPEAT:
-                    # FIXME: <fl> fast and wrong (but we'll fix that)
-                    emit(OPCODES[REPEAT_ONE])
-                    skip = len(code); emit(0)
-                    emit(av[0])
-                    emit(av[1])
-                    _compile(code, av[2], flags)
-                    emit(OPCODES[SUCCESS])
-                    code[skip] = len(code) - skip
+                emit(OPCODES[REPEAT])
+                skip = len(code); emit(0)
+                emit(av[0])
+                emit(av[1])
+                _compile(code, av[2], flags)
+                code[skip] = len(code) - skip
+                if op == MAX_REPEAT:
+                    emit(OPCODES[MAX_UNTIL])
                 else:
-                    emit(OPCODES[REPEAT])
-                    skip = len(code); emit(0)
-                    emit(av[0])
-                    emit(av[1])
-                    _compile(code, av[2], flags)
-                    code[skip] = len(code) - skip
-                    if op == MAX_REPEAT:
-                        emit(OPCODES[MAX_UNTIL])
-                    else:
-                        emit(OPCODES[MIN_UNTIL])
+                    emit(OPCODES[MIN_UNTIL])
         elif op is SUBPATTERN:
             if av[0]:
                 emit(OPCODES[MARK])
diff --git a/Lib/sre_constants.py b/Lib/sre_constants.py
index e595915..5a20930 100644
--- a/Lib/sre_constants.py
+++ b/Lib/sre_constants.py
@@ -20,6 +20,7 @@
 SUCCESS = "success"
 
 ANY = "any"
+ANY_ALL = "any_all"
 ASSERT = "assert"
 ASSERT_NOT = "assert_not"
 AT = "at"
@@ -81,7 +82,7 @@
     # failure=0 success=1 (just because it looks better that way :-)
     FAILURE, SUCCESS,
 
-    ANY,
+    ANY, ANY_ALL,
     ASSERT, ASSERT_NOT,
     AT,
     BRANCH,
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py
index 1eec3d3..1c1d0d5 100644
--- a/Lib/sre_parse.py
+++ b/Lib/sre_parse.py
@@ -142,7 +142,7 @@
                 for av in av[1]:
                     l, h = av.getwidth()
                     i = min(i, l)
-                    j = min(j, h)
+                    j = max(j, h)
                 lo = lo + i
                 hi = hi + j
             elif op is CALL: