Problème avec python & javascipt

Fermé
ilyess_kira Messages postés 45 Date d'inscription mercredi 9 mai 2012 Statut Membre Dernière intervention 6 décembre 2012 - 4 juin 2012 à 15:44
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 5 juin 2012 à 13:42
Bonjour,


Je débute en programmation et python & javascript donc je m'excuse si ma question peut paraître débile à certain

je voudrais savoir s'il y 'a moyen de faire un programme sur python qui extrait des chaînes de caractère [expressions régulières] et qui renvoi ce résultat sous forme de liens en html

Voici mon code

#!/usr/bin/python

import re
import sys
	



print "Content-type: text/html; charset=iso-8859-1\n\n"


print'<html> '

print '<PRE>'

f=open("test.log","r")
while 1:
	txt = f.readline()
	if txt == '':
		break
	if re.match("dls_rlc_mac",txt):
		print txt
	
f.close()




print'</PRE>'



print'<script>'
print 'function charger() { '

print'w1 = open("",TARGET="zone2");'

print'w2 = open("zone3.py", TARGET="zone3");}' 
 
print '</script> '


print'<a href="javascript:" onClick=javascript:charger();>dls_rlc_mac_ue_configuration_request </a> '

print'</body> '

print'</html>'






Donc ce que je veux c'est d'afficher le résultat de mon programme python à la place de :
dls_rlc_mac_ue_configuration_request

Merci pour vos réponses




<config>Windows XP / Safari 536.5</config>

4 réponses

heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 4/06/2012 à 17:17
Bonjour

Je ne comprends pas bien.

Qu'y a-t-il dans le fichier de nom test.log ?

Pourquoi tous ces print ?

Note que je connais fort peu javascript , à peine quelques principes
0
ilyess_kira Messages postés 45 Date d'inscription mercredi 9 mai 2012 Statut Membre Dernière intervention 6 décembre 2012
Modifié par ilyess_kira le 5/06/2012 à 10:05
Bonjour,

C'est dans le fichier test.log que j'ai la chaîne que je veux extraire et donc l'afficher sous forme de lien sous html.
Les print c'est par ce que je travail sur un serveur python et si je veux qu'il comprenne le html faut que je mette des print partout ( mais ceci n'est pas vrmnt le problème )

J'utilise une boucle en Python pour afficher une liste de liens.
Voilà ma boucle concernée :

while 1: 
 txt = f.readline() 
 if txt == '': 
  break 
 if re.match("dls_rlc_mac",txt) 
:

Et le résultat de ma de mon if je vois qu'il soit sous forme de lien html
j'ai essayé plusieurs méthode de concaténation mais ça marche pas mieux
exemple :
print'<a href="javascript:" onClick=javascript:charger();>'txt'</a> ' 


Merci d'avance
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 5/06/2012 à 11:56
Je n'y comprends toujours pas grand chose.

Y a-t-il une seule chaîne ou plusieurs que tu veux extraire du fichier test.log ?
S'il y en a plusieurs, peux tu donner en exemple une dizaine de ces chaînes, stp.
S'il y en a une seule, peux tu préciser si elle comporte une partie variable ou non.
Les expressions régulières permettent de détecter et capturer des chaînes ayant à la fois des caractéristiques fixes (sinon on ne pourrait pas les détecter) et des parties variables.
Faut il comprendre que dans 'dls_rlc_mac_ue_configuration_request' la partie '_ue_configuration_request ' est ici une valeur précise mais que dans d'autres chaînes cette partie est différente ?


D'autre part je ne comprends pas ce que signifie "afficher une chaîne sous forme de lien sous html"

Veux tu faire afficher des chaînes, trouvées dans un fichier test.log, dans une fenêtre de navigateur au lieu de les faire afficher dans une console Python ou une fenêtre IDLE ?


Je ne comprends pas plus l'histoire des print.



PS
Pour lire le fichier, ceci est mieux:

f=open("test.log","r")    
    for line in f:    
        .............    
        ......        
        ...........    
f.close()


et ceci encore mieux:

with open("test.log","r") as f:    
    for line in f:    
        .............    
        ......        
        ...........




PPS

Quand on cherche quelque chose dans un fichier avec une expression régulière, ce n'est pas la peine de passer les lignes en revue une par une. Il est plus judicieux d'analyser le contenu du fichier d'un coup:

with open("test.log","r") as f:   
    content = f.read()   

li = regx.findall(content)   
# et ensuite on travaille sur li   

# ou bien :  
for match in regx.finditer(content):   
    .............   
    ........   
    ................
0
ilyess_kira Messages postés 45 Date d'inscription mercredi 9 mai 2012 Statut Membre Dernière intervention 6 décembre 2012
5 juin 2012 à 12:06
Je vais essayer d'être plus clair cette fois-ci.

J'ai une page html divisée en 2 parties avec des frames ( je sais que c'est obsolète mais on m'a demandé de faire avec )

le fichier test.log c'est un fichier que j'ai fais moi même et qui comporte de l'hexadecimal ainsi que des chaînes de caractères. voila à quoi il resemble :

dls_rlc_mac_ue_configuration_request_t
			00840044 00000040 00000000 0085FFFF   ...D...@........
			00000010 00000000 25000750 03E80001   ........%..P....
			00000000 00000000 00000000 00000000   ................
			00000001 00000000 00000000 00000000   ................
			00000000 00000000 00000000 00000000   ................
			00000000 00000000 00000000            ............
dls_rlc_mac_ue_configuration_response_t
			00433399 00461040 0000AF580 0030FFFF   .......@........
.......



dans un premier temps j'ai fais un premier programme pour extraire tous l'hexadécimal
Donc ça c'est OK.

ce que je veux faire maintenant c'est extraire tous les chaines de caractère qui commence par "dls_rlc_mac" donc il y en a plusieurs et les afficher dans la frame 1 sous forme de lien en html

et en cliquant sur un ces liens je dois obtenir le résultat de mon premier programme càd afficher de l'hexadécimal dans la 2éme frame.

( c'est un peu bourrin mais je veux que ça marche comme ça déjà après pour faire propre chaque lien dois me renvoyer l'hexadécimal qui lui correspond

par exmple:

dls_rlc_mac_ue_configuration_request_t (frame 1 )
dls_rlc_mac_ue_configuration_response_t(frame 1)

si je clique sur le premier lien j'ai ça :
00840044 00000040 00000000 0085FFFF ......... (frame 2)

et si je clique sur le 2 eme lien j'obtient ça :
00433399 00461040 0000AF580 0030FFFF......(frame 2 )


Merci encore une fois
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
5 juin 2012 à 13:07
J'ail'impression que ton problème réside d'abord dans la compréhension de ce que fait le module re en Python.

Il faut comprendre qu'il y a 4 sortes d'objets :

- pattern de regex (une chaîne)
- regex (objet de classe RegexObject)
- match (objet de classe MatchObject)
- méthodes d'objet match



Un pattern de regex sert à définir une regex par compilation:
regx = re.compile(pattern de regex)
Personnellement, je m'efforce de n'employer 'expression régulière" et "regex" que pour désigner exclusivement les objets de type RegexObject




Une regex peut servir à détecter le premier matching dans une chaîne ss:
regx.search(ss)
Cette expression crée un objet de type MatchObject auquel on peut assigner un nom
ma = regx.search()

Disposer d'un objet match permet ensuite d'exploiter les données que contient ce match par le biais de ses méthodes:
ma.end(),ma.groups(), ma.group(2), ma.lastindex, etc



Une regex peut servir aussi à détecter plusieurs matchings dans une chaîne:
for ma in regx.finditer(ss): 
C'est pour cela qu'il est intéressant de créer une regex: quand il y a à détecter dans un texte plusieurs fois un motif répondant au pattern de la regex , disposer de la regex permet d'éviter la recompilation implicitement contenue dans l'instruction
re.search(pattern de regex, ss)
à chaque fois qu'elle serait appelée.




Pour débroussailler ton problème, je crois donc qu'il faut commencer par attraper succintement les chaînes voulues dans ton fichier:

La méthode findall() d'une regex condense deux processus: la recherche de match et la sollicitation de la méthode group() ou groups() (selon s'il y a des groupes définis dans le pattern de la regex)

Tu devrais donc essayer ceci:

import re

regx = re.compile('dls_rlc_mac[^ ]+')

with open("test.log","r") as f:   
    content = f.read() 

li = regx.findall(content)


L'objet li sera la liste des chaînes que tu recherches

[^ ]+ signifie: toute suite de caractères sauf le blanc
Si on voulait exclure le caractère 'k' on écrirait [^k]+
Ici pour aller au bout de la suite de caractères qu peuvent être a priori n'importe quoi, j'utilise un blanc.


S'il y avait à faire des traitements sur le match capté par chaque matching, il faudrait utiliser la méthode finditer() de la regex qui , elle, fournit les matches l'un après l'autre, ce qui permet de travailler dessus
0
ilyess_kira Messages postés 45 Date d'inscription mercredi 9 mai 2012 Statut Membre Dernière intervention 6 décembre 2012
5 juin 2012 à 13:25
J'ai essayé avec votre méthode ..... sauf que ça ne marche pas vraiment . il me met qu'il y'a des erreurs partout et je ne vais pas pouvoir les résoudre vu que déjà comme vous l'avez deviné je ne suis pas expert dans le module re de Python et qu'en plus j'étais assez satisfait avec le résultat du petit code que j'ai fais....
mais au final le problème ce n'est pas l'extraction de la chaîne elle même mais plutôt commet transformer le résultat " li " ou "txt "dans mon cas, sous forme de lien en html.
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
Modifié par heyquem le 5/06/2012 à 13:48
Pas la peine d'être expert, ne t'inquiète pas.
Si tu indiques quelles sont le erreurs, je corrigerai. Ca m'étonnerait que ce soit bien compliqué


Bon, pour ce qui est du "lien", si je comprend bien tu veux obtenir

'<a href="javascript:" onClick=javascript:charger();>dls_rlc_mac_ue_configuration_request_t</a> '
à partir de
'dls_rlc_mac_ue_configuration_request_t'

et
'<a href="javascript:" onClick=javascript:charger();>dls_rlc_mac_ue_configuration_response_t</a> '
à partir de
'dls_rlc_mac_ue_configuration_response_t'


Il suffit de faire:

# avec     
li = ['dls_rlc_mac_ue_configuration_request_t',    
      'dls_rlc_mac_ue_configuration_response_t']    


for el in li:    
    print el.join('<a href="javascript:" onClick=javascript:charger();>',    '</a> ')
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
5 juin 2012 à 13:34
Ensuite,

quand tu dis que le fichier contient de l'hexadécimal, tu veux dire qu'il y a des suites de caractères qui représentent des valeurs numériques exprimées en notation hexdécimale ?
Mais ce sont quand même des caractères dans le fichier ?
Auquel cas, avec une regex, il va être possible de tout attraper d'un coup, les chaînes de caractères et les informations numériques exprimées en hexadécimal
0