IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tcl/Tk Discussion :

Compilation regex et détermination position


Sujet :

Tcl/Tk

  1. #1
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut Compilation regex et détermination position
    Bonjour,

    je voudrais savoir s'il y a un moyen d'utiliser des regex compilées avec Tcl

    En fait j'ai une fonction qui va être appelée très souvent et j'imagine que tcl va recompiler les regex à chaque appelle de la fonction. Pour éviter cette perte de temps, je voudrais compiler mes regex une bonne fois pour toute et les utiliser après.

    J'aurais aussi voulu savoir s'il existe une commande pour récupérer la position d'un modèle dans un texte.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    %set pos [trouveregex t salut ]
    %puts pos
    4
    merci d'avance.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 528
    Points
    528
    Par défaut
    Bonsoir,

    1)
    Pour répondre à la première question, il faudrait un peu plus de précisions
    sur le code. Car grâce au compilateur de bytecode (inclus depuis une décennie),
    Tcl-Tk ne recompile pas forcément les instructions à chaque appel de fonctions.

    Idéalement, quand c'est possible, il est préférable d'utiliser string match
    et string first (plus performant) au lieu de regexp/regsub.

    2)
    Si il n'y a qu'un seul caractère de ce type à trouver dans la chaîne,
    on peut employer string first:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set pos [string first t salut]
    Cordialement,

    ----
    Canvas

  3. #3
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    Bonjour,

    merci beaucoup pour ces informations précieuses.
    En fait, je veux réécrire un widget python/tkinter en tcl/tk.

    le type de regex que je veux utiliser sont celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [-+]?([0-9]+\.?[0-9]*|\.[0-9]+)([eE][-+]?[0-9]+)?
    '[^'\n]*(\\.[^'\n]*)*'?
    --[^\n]
    Dans le script Python, j'ai déjà ma liste de regex pré-compilées, j'extraie le texte d'un widget Text.

    je recherche les nombres, chaînes de caractère, commentaire et ajoute les tags correspondant au widget text .

    script python :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
        def color_text( self, event ) :
            """
            Coloration syntaxique. 
            """
            zone_de_text = self.zone_de_text
            zone_de_text.tag_remove( 'number',  '0.0', 'end' )
            zone_de_text.tag_remove( 'comment', '0.0', 'end' )
            zone_de_text.tag_remove( 'string',  '0.0', 'end' )
            zone_de_text.tag_remove( 'keyword', '0.0', 'end' )
     
            text = zone_de_text.get( '0.0', 'end' )
            for tag, regex in self.virtualconsol.regexs.items() : # dico { tag => regex, ... }
                lastPos = 0
                while 1 :
                    match = regex.search( text, lastPos )
                    if match is None :
                        break
     
                    lastPos = match.end()
                    zone_de_text.tag_add( tag,
                                 '%s + %d chars' % ( 0.0, match.start() ),
                                 '%s + %d chars' % ( 0.0, lastPos ) )

    Pour le code tcl/tk c'est un peu différent j'utilise text search :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    $self.zone_de_text insert end {\npour un teste 45.0  test 5 test -2e4} 
    set regexs(number) {[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)([eE][-+]?[0-9]+)?}
     
    bind $self.zone_de_text <KeyPress> {
        # Coloration syntaxique. 
        global $self.zone_de_text $self.button 
     
        $self.zone_de_text tag remove number  0.0 end
        $self.zone_de_text tag remove comment 0.0 end
        $self.zone_de_text tag remove _string 0.0 end
        $self.zone_de_text tag remove keyword 0.0 end 
     
     
        set size 0
        set var [$self.zone_de_text search -count size -regexp  $regexs(number) 1.0 end]
        if $size>0 { $self.zone_de_text tag add number $var "$var + $size chars" }
    idéalement il me faudrait ceci pour la regex nombre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    \b[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)([eE][-+]?[0-9]+)?\b
    mais avec des \b ou \\b, (caractères blancs) ça ne fonctionne pas.

    Ce sont mes premières lignes de code tcl/tk. J'imagine qu'elles doivent être maladroite et que je peux procéder plus efficacement.

    Cordialement
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

Discussions similaires

  1. Déterminer position de l'ordinateur client
    Par josse34 dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2013, 10h13
  2. compilation regex-0.12.tar.tar regex.exe
    Par J4e8a16n dans le forum C
    Réponses: 7
    Dernier message: 15/04/2009, 14h46
  3. Déterminer la position d'un UserControl dans une Form
    Par Delphi-ne dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 25/11/2007, 13h59
  4. Regex : Stocker les motifs compilés ?
    Par OrthoMaker dans le forum C++
    Réponses: 17
    Dernier message: 14/01/2007, 20h17
  5. Déterminer la position de la souris
    Par genteur slayer dans le forum Composants VCL
    Réponses: 6
    Dernier message: 16/06/2003, 11h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo