2012-06-24 14 views
8

Algo que puede convertir¿hay algún compilador que pueda convertir expresiones regulares a fsm? o podría convertirse a palabras humanas?

r"a+|(?:ab+c)" 

a

{ 
    (1, 'a') : [2, 3], 
    (2, 'a') : [2], 
    (3, 'b') : [4, 3], 
    (4, 'c') : [5] 
} 

o algo similar

y aceptar en 2 o 5

+1

De vuelta en nuestras clases de CS teóricas, sí tenemos un método para convertir expresiones regex a un FSM. Después de todo, eso es exactamente lo que tiene que hacer un motor de expresiones regulares. – Joey

Respuesta

4

tengo un código que hará esto. no está bien documentado y no es compatible, pero si está interesado, puede mirarlo.

la biblioteca se llama rxpy y el repositorio es http://code.google.com/p/rxpy

la rutina que hace el análisis es parse_pattern en http://code.google.com/p/rxpy/source/browse/rxpy/src/rxpy/parser/pattern.py#871

si llama repr(...) sobre el resultado de que se obtiene un gráfico en el "lenguaje de puntos" - https://en.wikipedia.org/wiki/DOT_language

por ejemplo, ver las pruebas como http://code.google.com/p/rxpy/source/browse/rxpy/src/rxpy/parser/_test/parser.py#47

para mostrar lo que quiero decir, vamos a ver la prueba http://code.google.com/p/rxpy/source/browse/rxpy/src/rxpy/parser/_test/parser.py#234 en el que es para 'ab*c':

"""digraph { 
0 [label="a"] 
1 [label="...*"] 
2 [label="b"] 
3 [label="c"] 
4 [label="Match"] 
0 -> 1 
1 -> 2 
1 -> 3 
3 -> 4 
2 -> 1 
}""" 

que comienza a las 0 que puede coincidir con una "a" para ir al estado 1. desde allí puede hacer coincidir una "b" para ir al estado 2 o una "c" para ir al estado 3. estado 2 luego tiene una transición de regreso a 1 que puede consumir otra "b", etc. etc. es un poco feo leer a mano, pero cuando la prueba falla, se obtiene un pequeño gráfico en la pantalla.

la biblioteca también tiene varios "motores" que coincidirán con cadenas contra este gráfico (y también lo hacen con la coincidencia de expresiones regulares). pero es mucho más lento que la biblioteca de python (porque es pura python).

esto no es compatible y puede que no sea muy claro, lo siento, pero creo que está cerca de lo que desea y puede usarlo si es útil (licencia MPL o LGPL).

6

Usted tiene una debug flag que imprime su expresión regular de una forma más legible formulario:

>>> import re 
>>> re.compile(r"a+|(?:ab+c)", flags=re.DEBUG) 
branch 
    max_repeat 1 65535 
    literal 97 
or 
    subpattern None 
    literal 97 
    max_repeat 1 65535 
     literal 98 
    literal 99 
<_sre.SRE_Pattern object at 0x0000000002325328> 
Cuestiones relacionadas