На самом деле, пример работает просто отлично ... до мелочей. Я бы написал:
>>> p = re.compile('b*(abb*)*a?')
>>> m = p.match('aa')
>>> print m.group(0)
'a'
>>> m = p.match('abbabbabababbabbbbbaaaaa')
>>> print m.group(0)
abbabbabababbabbbbba
Обратите внимание, что группа 0 возвращает часть строки, совпадающую с регулярным выражением.
Как видите, выражение соответствует последовательности a и b без повторения a. Если действительно, вы хотите проверить всю строку, вам нужно немного изменить:
>>> p = re.compile('^b*(abb*)*a?$')
>>> m = p.match('aa')
>>> print m
None
^
и $
принудительно распознают начало и конец строки.
Наконец, вы можете объединить оба метода, используя первое регулярное выражение, но с проверкой в конце:
>>> len(m.group(0)) == len('aa')
Добавлено: Для второй части OT, как мне кажется, нет никакого расхождения между стандартным регулярным выражением и реализацией Python. Конечно, нотация немного отличается, и реализация Python предлагает некоторые расширения (как и большинство других пакетов).