2009-03-03 6 views
13

Existe-t-il un moyen de déboguer une expression régulière en Python? Et je ne parle pas au processus d'essayer et d'essayer jusqu'à ce qu'ils travaillent :)Comment puis-je déboguer une expression régulière en python?

EDIT: voici comment les expressions rationnelles peuvent être débogués en Perl:


use re 'debug'; 

my $str = "GET http://some-site.com HTTP/1.1"; 
if($str =~/get\s+(\S+)/i) { 
    print "MATCH:$1\n"; 
} 

Le code ci-dessus produit la sortie suivante sur mon ordinateur lorsqu'il est lancé:


Compiling REx "get\s+(\S+)" 
Final program: 
    1: EXACTF (3) 
    3: PLUS (5) 
    4: SPACE (0) 
    5: OPEN1 (7) 
    7: PLUS (9) 
    8:  NSPACE (0) 
    9: CLOSE1 (11) 
    11: END (0) 
stclass EXACTF minlen 5 
Matching REx "get\s+(\S+)" against "GET http://some-site.com HTTP/1.1" 
Matching stclass EXACTF against "GET http://some-site.com HTTP/1.1" (33 chars) 
    0   | 1:EXACTF (3) 
    3  | 3:PLUS(5) 
            SPACE can match 1 times out of 2147483647... 
    4  | 5: OPEN1(7) 
    4  | 7: PLUS(9) 
            NSPACE can match 20 times out of 2147483647... 
    24  | 9: CLOSE1(11) 
    24  | 11: END(0) 
Match successful! 
MATCH:http://some-site.com 
Freeing REx: "get\s+(\S+)" 

+0

Sérieusement: donnez SO vos regex + données d'échantillon? – annakata

+0

Sans l'exemple de code, tout ce que nous pouvons faire est de deviner quel est votre problème. –

+3

Je n'ai pas de problème regex pour le moment. Je veux seulement savoir comment effectuer le débogage. – Geo

Répondre

17
 

>>> p = re.compile('.*', re.DEBUG) 
max_repeat 0 65535 
    any None 
>>>       
 

regex '|' operator vs separate runs for each sub-expression

+7

C'est juste la moitié de la réponse, elle montre ce que l'expression rationnelle compile, mais ne montre pas comment elle est exécutée une chaîne donnée. Si quelqu'un connaît l'autre moitié, merci de partager! – Nickolay

1

Pourquoi ne pas utiliser certains outils rEGEX (je l'utilise habituellement Regulator) et tester les y regex-expression et lorsque vous êtes satisfait, il suffit de copier/coller dans votre code.

+0

Parce que l'utilisation d'un outil regex ne me dira pas pourquoi mon regex ne fonctionne pas. – Geo

+0

@Geo - que voulez-vous dire par "ne fonctionne pas". Ne fonctionne pas du tout, ne correspond pas aux choses que vous voulez faire correspondre ou ...? – Rook

+1

Au risque d'énoncer l'évidence, un outil regex ne peut pas vous dire pourquoi il ne vous donne pas les bonnes correspondances. Une regex va faire exactement ce que vous lui dites, et le meilleur outil que n'importe quel outil peut faire est de vous guider afin que vous puissiez déterminer vous-même quel bit est faux. – Noldorin

-1

ne suis pas sûr de faire une telle chose directement en Python, mais je pourrais suggérer certainement utiliser un outil éditeur de RegEx. C'est probablement votre meilleur pari de toute façon. Personnellement, j'ai utilisé The Regulator et je l'ai trouvé très utile. Certains autres sont répertoriés dans this SO thread.

-1

J'utilise assez souvent RegexPal pour des contrôles rapides (une expression régulière en ligne prototyper). Il a beaucoup d'expressions communes répertoriées avec une expression simple. Très utile lorsque vous n'avez pas d'outil dédié et que vous avez juste besoin d'un moyen rapide de travailler sur une certaine expression régulière.

+0

Pourquoi le vote négatif? –

0

Ce que RegexBuddy n'a pas dans les autres outils est un debugger intégré qui vous montre tout le processus correspondant des tentatives de correspondance réussies et échouées. Les autres outils montrent seulement le résultat final (que RegexBuddy peut montrer aussi).

1

https://www.debuggex.com est également très bon. C'est un débogueur en ligne Python (et quelques autres langues), qui a une visualisation assez nette de ce qui fait et ce qui ne correspond pas. Une très bonne ressource si vous avez besoin de rédiger une regexp rapidement.

+2

Oh mon dieu, c'est la meilleure réponse tout en bas, je suis content d'avoir creusé ici.C'est un super outil, c'est gratuit, c'est en ligne (pas d'installation, indépendant du système d'exploitation) et ça a résolu mon problème (une faute de frappe stupide) au lieu de}) en un clin d'oeil! Merci! – Davide

Questions connexes