2010-11-23 15 views
2

Je voudrais analyser une liste d'expressions régulières pour calculer la probabilité de chacun pour trouver une allumette dans un certain texte/string ...en utilisant pyparsing pour analyser une liste des expressions rationnelles (littéralement)

Par exemple. trouver '[AB]' dans une chaîne de longueur 1 devrait être quelque chose autour de 1/13 (en considérant seulement les lettres captiales).

Existe-t-il un analyseur d'expressions régulières générique, qui renvoie les positions/alternatives individuelles? Je pense à obtenir une liste des postes de retour (« [AB].A{2} « donnerait » [['A','B'],'.',['AA'] »)

Le problème est l'analyse syntaxique des expressions régulières avec pyparsing. Les expressions régulières simples ne sont pas un problème, mais quand il s'agit de "alternatives" et répétitions, je suis perdu: J'ai du mal à analyser les expressions imbriquées comme '((A[AB])|(AB))'.

Des pensées?

+0

J'ai écrit un Code Golf sur ce sujet il y a quelque temps (http://stackoverflow.com/questions/3523323/code-golf-regex-parser). Étant le code de golf, la plupart des réponses seront un peu difficiles à déchiffrer. Mais le même problème s'est présenté, et les gens beaucoup plus intelligents que je ne serai jamais trouvé un moyen. :-) –

+0

J'ai proposé une réponse à votre question de vraisemblance, et maintenant je vois que vous avez une deuxième question sur l'existence d'un analyseur de regex. Il doit y avoir au moins un tel parseur, celui que Python utilise. Vous obtiendrez probablement votre réponse d'un expert de Python si vous étiquetez clairement votre question comme concernant les internes de Python. – Narveson

+0

Avez-vous regardé cet exemple sur le wiki pyparsing? http://pyparsing.wikispaces.com/file/view/invRegex.py – PaulMcG

Répondre

2

La simulation plutôt que le calcul peut être la voie à suivre.

Configurer une population de chaînes de texte représentatives. (Les linguistes appellent un tel ensemble un corpus.) Pour toute regex donnée, trouvez le nombre de chaînes qu'elle correspond et divisez par le nombre total de chaînes dans votre corpus.

Votre propre exemple donnant la probabilité que '[AB]' soit 1/13 est basé sur cette façon de penser, en utilisant le corpus des chaînes de lettres majuscules. Vous avez 1/13 en voyant qu'il y a deux matches sur les 26 cordes du corpus.

Créer un corpus plus grand: peut-être l'ensemble de toutes les chaînes alphanumériques jusqu'à une certaine longueur, ou toutes les chaînes ASCII jusqu'à une certaine longueur, ou le dictionnaire de votre choix. Penser à quel corpus correspond le mieux à votre objectif est un bon moyen de clarifier ce que vous entendez par «probabilité».

+0

merci pour cette approche intéressante! Cependant, je m'intéressais à la manière d'analyser des expressions rationnelles complexes plutôt qu'à la notation (ce qui devrait être plus ou moins banal car mon jeu de lettres est assez limité et leurs probabilités individuelles sont connues) ... – Hans

0

Vous utilisez [ « A », « B »] dire: ou A ou B. vous pouvez mettre quelque chose comme ceci:

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

À là, vous utilisez [] pour « l'un de ces "comme l'utilisation {} pour "tous ces"

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) 

Ce fut une explication si mal ... Je retente ...

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

comprendre?

+0

Merci de partager cela, mais mon problème est plutôt de savoir comment analyser la regex complexe et arriver à des positions individuelles de l'expression rationnelle plutôt que de savoir comment marquer chaque position individuelle ... – Hans