2014-01-28 6 views
7

Я хочу написать регулярное выражение в режиме re.VERBOSE, но я не уверен, что добавлю детальную часть без ошибок.Проверка соответствия двух шаблонов регулярных выражений Python

Я помню, что теоретически эквивалентность двух регулярных выражений (по крайней мере, без обратных ссылок) может быть найдена путем генерации их автоматов и попытки найти биекцию графа. Но нет метода экземпляра, который я могу увидеть для сравнения регулярных выражений.

Есть ли способ генерировать автомат регулярного выражения или напрямую сравнивать их, желательно со стандартной библиотекой?

(я уже решил на другое решение моей проблемы, но это по-прежнему представляет интерес для меня.)

ответ

6

Вы можете использовать недокументированные re.DEBUG особенность:

>>> r1 = re.compile("foo[bar]baz", re.DEBUG) 
literal 102 
literal 111 
literal 111 
in 
    literal 98 
    literal 97 
    literal 114 
literal 98 
literal 97 
literal 122 
>>> r2 = re.compile("""foo # foo! 
...     [bar] # b or a or r! 
...     baz # baz!""", re.VERBOSE|re.DEBUG) 
literal 102 
literal 111 
literal 111 
in 
    literal 98 
    literal 97 
    literal 114 
literal 98 
literal 97 
literal 122 

Если выход идентичен, r1 и r2 также идентичны.

+0

Больше недокументированных, чем задокументированных. Кроме того, пытаясь написать функцию для проверки равенства регулярных выражений, я обнаружил, что из-за 're.compile' кэширования своих результатов' re.DEBUG' может не выдавать результат. И это не теоретическая эквивалентность регулярного выражения, поэтому это работает только для изменений 're.VERBOSE'. Вот моя реализация, с примерами: http://pastebin.com/DeCWLmF8 (Не стесняйтесь добавлять из этого комментария к вашему ответу.) – leewz

+0

Я разочарован тем, что 're' не сохраняет вывод отладки, и что я не может принудительно перекомпилировать с 're.DEBUG'. – leewz

+1

Поднял вопрос о 're.DEBUG', не заставляя перекомпилировать: http://bugs.python.org/issue20426 – leewz

Смежные вопросы