2010-11-23 11 views
2

Ich mag würde analysieren, eine Liste von regulären Ausdrücken analysieren mit der Wahrscheinlichkeit eines jeden zu berechnen ein Spiel, um es in einem bestimmten Text/string zu finden ...pyparsing eine Liste von regulären Ausdrücken (buchstäblich)

Z.B. Das Finden von '[AB]' in einer Zeichenkette der Länge 1 sollte etwas um 1/13 sein (nur Großbuchstaben beachten).

Gibt es einen generischen Regex-Parser, der die einzelnen Positionen/Alternativen zurückgibt? Ich denke an eine Liste von Positionen als Rückkehr bekommen (‚[AB].A{2}‚ergäbe‘[['A','B'],'.',['AA']‘)

Das Problem ist, das Parsen von regulären Ausdrücken mit pyparsing. Einfache Regexes sind kein Problem, aber wenn es um "Alternativen" und Wiederholungen geht, bin ich verloren: Ich finde es schwierig, geschachtelte Ausdrücke wie '((A[AB])|(AB))' zu analysieren.

Irgendwelche Gedanken?

+0

Ich schrieb vor einiger Zeit einen Code Golf (http://stackoverflow.com/questions/3523323/code-golf-regex-parser). Als Code Golf werden die meisten Antworten ein wenig schwer zu entziffern sein. Aber das gleiche Problem kam auf, und die Menschen, die viel intelligenter sind als ich, werden jemals einen Weg finden. :-) –

+0

Ich habe eine Antwort auf Ihre Wahrscheinlichkeitsfrage angeboten, und jetzt sehe ich, dass Sie eine zweite Frage über die Existenz eines Regex-Parsers haben. Es muss mindestens einen solchen Parser geben, den Python verwendet. Sie werden Ihre Antwort wahrscheinlich von einem Python-Experten erhalten, wenn Sie Ihre Frage eindeutig als Python-Interna bezeichnen. – Narveson

+0

Hast du dir dieses Beispiel im pyparsing Wiki angeschaut? http://pyparsing.wikispaces.com/file/view/invRegex.py – PaulMcG

Antwort

2

Simulation statt Berechnung möglicherweise der Weg zu gehen.

Richten Sie eine Population repräsentativer Textstrings ein. (Linguisten würden einen solchen Satz als Korpus bezeichnen.) Finden Sie für jeden gegebenen Regex die Anzahl der übereinstimmenden Strings und dividieren Sie diese durch die Gesamtzahl der Strings in Ihrem Korpus.

Ihr eigenes Beispiel, das die Wahrscheinlichkeit von "[AB]" als 1/13 angibt, basiert auf dieser Denkweise und verwendet das Korpus von Strings mit einem einzelnen Großbuchstaben. Sie haben 1/13, indem Sie sehen, dass zwei Streichhölzer aus den 26 Strings im Korpus sind.

Erstellen Sie ein größeres Korpus: vielleicht die Menge aller alphanumerischen Zeichenfolgen bis zu einer bestimmten Länge oder alle ASCII Zeichenfolgen bis zu einer bestimmten Länge oder das Wörterbuch Ihrer Wahl. Wenn Sie darüber nachdenken, welches Korpus für Ihre Zwecke am besten geeignet ist, ist dies eine gute Möglichkeit zu klären, was Sie unter "Wahrscheinlichkeit" verstehen.

+0

danke für diesen interessanten Ansatz! Ich interessierte mich jedoch dafür, wie man komplexe Regexes parsieren kann, anstatt das Scoring (was mehr oder weniger trivial sein sollte, da meine Menge an Buchstaben ziemlich begrenzt ist und ihre individuellen Wahrscheinlichkeiten bekannt sind) ... – Hans

0

Sie verwenden [ ‚A‘, ‚B‘] zu sagen: oder A oder B, dann können Sie einige Sache so:

'[{'A', ['A', 'B']}, {'A', 'B'}]' 

Bei dort verwenden Sie [], um „eins von diesen "als Verwendung {}, um "all diese"

1/2 to '{'A', ['A', 'B']}' 
    'A' => 1/1 
    ['A', 'B'] => 1/2 
    (1/1) * (1/2) = 1/2 
    this (1/2) times the extern (1/2) = (1/4) 
1/2 to '{'A', 'B'}' -> (1/26) to each. 
Multiplify two times: 1/(26^2) and multiplify by the 1/2 = (1/(26^2))/2. 

Now multiplify both: (1/4) * ((1/(26^2))/2) 

Es war eine so schlechte Erklärung ... ich werde versuchen ...

[] => Calc de probability: {probability of each term}/{num of terms} 
{} => Calc de probability of each term and multiplify all 

verstehen?

+0

Danke für das Teilen, aber mein Problem ist eher, wie man die komplexe Regex analysiert und zu einzelnen Positionen der Regex kommt, anstatt wie man jede einzelne Position bewertet ... – Hans

Verwandte Themen