[R] Utiliser les expressions régulières

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

[R] Utiliser les expressions régulières

#1

Message par pierrotm777 »

Bonjour,

Je cherche à récupérer les résultat d'une page web avec les expressions régulières !
Ce petit script permettrait de convertir une monnaie en une autre, ici us dollar en euro à partir d'une page msn!
► Afficher le texte
Le résultat se trouve après le mot "heading1black", ;<td class="heading1black">7.46714 Euro</td>

Merci de votre aide
Modifié en dernier par pierrotm777 le lun. 17 janv. 2011 17:22, modifié 1 fois.
Avatar du membre
FernandG
Membre émérite
Membre émérite
Messages : 194
Enregistré le : mar. 15 avr. 2008 21:50
Localisation : Picardie
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#2

Message par FernandG »

Bonjour,

Vous trouverez ci dessous votre code modifié afin de répondre à votre demande :

Code : Tout sélectionner

#Include <Inet.au3>

Global $MoneyFrom = 1
Global $MoneyTo = 9
Global $Value = 10

MsnMoney()

Func MsnMoney()
    Local $sUrl = "http://uk.moneycentral.msn.com/investor/market/crncconverter.asp?iCurIdFrom="&$MoneyFrom&"&iCurIdTo="&$MoneyTo&"&dAmt="&$Value
    $sSource = _INetGetSource($sUrl)
    If @error Then Return SetError(1)
    $sVal = StringRegExp($sSource, 'heading1black">(\d+\.\d{5})\sEuro</td>', 3)
    MsgBox(0, "***", $sVal[0])
EndFunc
Bon dimanche.
AutoItement.
Avatar du membre
FernandG
Membre émérite
Membre émérite
Messages : 194
Enregistré le : mar. 15 avr. 2008 21:50
Localisation : Picardie
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#3

Message par FernandG »

J'ai répondu sans même tenir compte des grands nombres lors de la conversion. Voici la partion de code à modifier pour en tenir compte :

Code : Tout sélectionner

    $sVal = StringRegExp($sSource, 'heading1black">(\d{0,3}\,?\d{0,3}\.\d{5})(\sBil)?(\sMil)?(\sEuro)</td>', 3)
    MsgBox(0, "***", $sVal[0] & $sVal[1] & $sVal[2] & $sVal[3])
Au dela de "Bil Euro", le site ne prend pas en charge :wink:
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#4

Message par pierrotm777 »

Merci de votre aide,
C'est impeccable pour les Euros, seulement si je remplace $MoneyTo = 9 par $MoneyTo = 10 (Argentine Peso), cela ne fonctionne plus !
► Afficher le texte
MsgBox(0, "***", $sVal[0] & $sVal[1] & $sVal[2] & $sVal[3])
MsgBox(0, "***", $sVal^ ERROR
Modifié en dernier par pierrotm777 le dim. 16 janv. 2011 12:56, modifié 1 fois.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#5

Message par jchd »

Normal, car le libellé de la monnaie n'est pas celui qui est attendu :

...class="heading1black">39.69830 Argentine Peso</td></tr>...

case 10 ;Argentine Peso
$Money = "Peso"

Pourquoi vouloir matcher le libellé de la monnaie ? Seul le taux de change est utile.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#6

Message par pierrotm777 »

Effectivement,
Vous auriez une solution ? :wink:
Avatar du membre
FernandG
Membre émérite
Membre émérite
Messages : 194
Enregistré le : mar. 15 avr. 2008 21:50
Localisation : Picardie
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#7

Message par FernandG »

jchd a écrit :Pourquoi vouloir matcher le libellé de la monnaie ? Seul le taux de change est utile.
Exact. Je suis resté dans l'exemple demandé sans porter attention à d'autres monnaies.
pierrotm777 a écrit :Vous auriez une solution ?
Oui, supprimer "(\sEuro)</td>" de l'expression régulière. Ensuite à vous d'adapter votre code à votre convenance :wink:

Bon après midi.
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#8

Message par pierrotm777 »

Désolé mais je ne vois pas :?
Avatar du membre
bloodwolff
Membre émérite
Membre émérite
Messages : 655
Enregistré le : ven. 18 avr. 2008 22:36
Localisation : Québec
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#9

Message par bloodwolff »

Code : Tout sélectionner

Stringregexp($source, "<td class="heading1black">([[:digit:],.]+) " & $devise & "</td>", 3 )
Compte skype : bloodwolfff
Avatar du membre
FernandG
Membre émérite
Membre émérite
Messages : 194
Enregistré le : mar. 15 avr. 2008 21:50
Localisation : Picardie
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#10

Message par FernandG »

pierrotm777 a écrit :Désolé mais je ne vois pas :?
Pas de souci. Voici un exemple de code, il en existe d'autres ...

Code : Tout sélectionner

Func MsnMoney()
    Local $sUrl = "http://uk.moneycentral.msn.com/investor/market/crncconverter.asp?iCurIdFrom="&$MoneyFrom&"&iCurIdTo="&$MoneyTo&"&dAmt="&$Value
;   ConsoleWrite(_INetGetSource($sUrl))
    $sSource = _INetGetSource($sUrl)
    If @error Then Return SetError(1)
    $sVal = StringRegExp($sSource, 'heading1black">(\d{0,3}\,?\d{0,3}\.\d{5})(\sMil)?(\sBil)?', 3)
    $sVal[0] = StringReplace($sVal[0], ",", "")
    If UBound($sval) = 3 Then
        $sResult = $sVal[0] * 1000000000
    ElseIf UBound($sval) = 2 Then
        $sResult = $sVal[0] * 1000000
    Else
        $sResult = $sVal[0]
    EndIf
    MsgBox(0, "***", $sResult & " " & $Money)
EndFunc ;==>MsnMoney
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#11

Message par pierrotm777 »

Alors , grands merci à bloodwolff et FerdinandG pour votre aide !

FerdinandG ton code est nickel !
Peux tu juste m'expliquer la ligne de code :

Code : Tout sélectionner

StringRegExp($sSource, 'heading1black">(\d{0,3}\,?\d{0,3}\.\d{5})(\sMil)?(\sBil)?', 3)
Merci encore
Avatar du membre
FernandG
Membre émérite
Membre émérite
Messages : 194
Enregistré le : mar. 15 avr. 2008 21:50
Localisation : Picardie
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#12

Message par FernandG »

pierrotm777 a écrit :FerdinandG
C'est bien la première fois :wink: :D

Code : Tout sélectionner

$pseudo = StringReplace($pseudo, "di", "")
me convient parfaitement :wink:

Description :

Code : Tout sélectionner

StringRegExp($sSource, 'heading1black">(\d{0,3}\,?\d{0,3}\.\d{5})(\sMil)?(\sBil)?', 3)
( et ) = Les parenthèses sont des délimiteurs de groupe et associé à la valeur 3 de StringRegExp, permettent la capture du contenu de toutes les parenthèses dans un tableau, voir la documentation de StringRegExp.

Pour : heading1black">
heading1black"> = Recherche exactement cette expression (aucun symboles spéciaux dans l'expression)

Pour : \d{0,3}\,?
\d = Un chiffre décimal
{0,3} = C'est un quantificateur, de 0 à 3 fois
\d{0,3} = Désigne donc une recherche d'un chiffre décimal 0, 1, 2 ou 3 à chiffres
\, = Séquence d'échappement pour la virgule, qui est un carcatère, un symbole spécial
? = C'est aussi un quantificateur, O ou 1 fois
\,? = Recherche donc une virgule, 0 ou 1 fois

Pour : \d{0,3}\.
\d{0,3} = On recommence une recherche de 0 à 3 chiffres
\. = Séquence d'échappement pour le point, qui est un carcatère, un symbole spécial, tout comme la virgule

Pour : \d{5}
\d{5} = Un ensemble de 5 chiffres décimal

Pour : (\sMil)?
\s = Un espace
Mil = Recherche du terme, du mot Mil
(\sMil)? = On recherche l'expression, le mot Mil (un espace suivi de Mil), le tout entre parenthèse, 0 ou 1 fois

Pour : (\sBil)?
(\sBil)? = On recommence pour l'expression, le mot Bil (un espace suivi de Bil), le tout entre parenthèse, 0 ou 1 fois

Dans l'expression, on remarque 3 parenthèses, donc 3 capture possible si l'expression régulière est confirmée.
- La première parenthèse capture le résultat
- La deuxième parenthèse capture l'expression Mil si elle existe
- La troisième parenthèse capture l'expression Bil si elle existe

Bon après midi.
Avatar du membre
bloodwolff
Membre émérite
Membre émérite
Messages : 655
Enregistré le : ven. 18 avr. 2008 22:36
Localisation : Québec
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#13

Message par bloodwolff »

Comme j'avais du temps à perdre j'ai fait une petit Gui vraiment laide pour te montrer comment inclure directement les combobox au lieu d'utiliser les numero, j'ai inclu le script qui m'a permi de créer le tableau en commentaire
► Afficher le texte
Modifié en dernier par bloodwolff le dim. 16 janv. 2011 16:24, modifié 1 fois.
Compte skype : bloodwolfff
Avatar du membre
FernandG
Membre émérite
Membre émérite
Messages : 194
Enregistré le : mar. 15 avr. 2008 21:50
Localisation : Picardie
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#14

Message par FernandG »

bloodwolff a écrit :Comme j'avais du temps à perdre ...
Attention, cela ne fonctionne pas si le résultat est supérieur à 999999 :wink:
Avatar du membre
bloodwolff
Membre émérite
Membre émérite
Messages : 655
Enregistré le : ven. 18 avr. 2008 22:36
Localisation : Québec
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#15

Message par bloodwolff »

humm merci j'avais pas remarqué la nuance de Mil et Bil , Voilà c'est corrigé

PS: Heyhey Mon 500e Message sur le forum ! Image
Compte skype : bloodwolfff
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#16

Message par pierrotm777 »

Messieurs , merci encore !!!!
Avatar du membre
FernandG
Membre émérite
Membre émérite
Messages : 194
Enregistré le : mar. 15 avr. 2008 21:50
Localisation : Picardie
Status : Hors ligne

Re: [..] Utiliser les expressions régulières

#17

Message par FernandG »

N'oubliez pas la balise [R] dans le titre de votre premier message si vous pensez que votre sujet est résolu.
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Utiliser les expressions régulières

#18

Message par pierrotm777 »

Franchement , je ne suis pas trés doué, j'essaie d'adapter vos lignes sans les combo et j'ai des résultats bizars !

Code : Tout sélectionner

[spoiler=]ConvertMoney(9,1,10000)
Func ConvertMoney($MoneyFrom,$MoneyTo,$Value)

;#cs
Dim $devise[108][2] = [ _
[1, " US dollar"], _
[2, "Canadian dollar"], _
[3, "British pound"], _
[7, "Japanese yen"], _
[8, "Australian dollar"], _
[9, "Euro"], _
[10, "Argentine Peso"], _
[13, "Bolivian Boliviano"], _
[14, "Brazilian real"], _
[15, "Swiss franc"], _
[16, "Chilean peso"], _
[17, "Chinese yuan"], _
[18, "Colombian Peso"], _
[19, "Czech koruna"], _
[20, "Danish krone"], _
[24, "Hong Kong dollar"], _
[25, "Hungarian forint"], _
[26, "Indonesian rupiah"], _
[28, "Korean Won"], _
[30, "Mexican Peso"], _
[32, "New Zealand dollar"], _
[33, "Norwegian krone"], _
[34, "Peruvian nuevo sol"], _
[37, "Russian Rouble"], _
[39, "Swedish krona"], _
[40, "Singapore dollar"], _
[41, "Thai baht"], _
[42, "Taiwan Dollar"], _
[43, "Venezualan Bolivar"], _
[44, "South African rand"], _
[45, "Guatemalan quetzal"], _
[46, "Moroccan Dirham"], _
[47, "Tunisian dinar"], _
[48, "Algerian dinar"], _
[49, "New Turkish Lira"], _
[50, "new Israeli shekel"], _
[51, "Malaysian ringgit"], _
[52, "Botswana pula"], _
[53, "Ghanaian Cedi"], _
[54, "Kenyan Shilling"], _
[55, "Namibian dollar"], _
[56, "Zimbabwe dollar"], _
[57, "Baharaini Dinar"], _
[59, "Indian rupee"], _
[60, "Jordanian Dinar"], _
[61, "Kuwaiti dinar"], _
[63, "Omani Rial"], _
[64, "Pakistan rupee"], _
[65, "Philippine Peso"], _
[66, "Qatari Rial"], _
[67, "Saudi Riyal"], _
[68, "Tanzanian Shilling"], _
[69, "Emirati Dirham"], _
[70, "Vietnamese dong"], _
[92, "Egyptian pound"]]

    $source = BinaryToString(InetRead("http://uk.moneycentral.msn.com/investor/market/crncconverter.asp?iCurIdFrom=" & $devise[$MoneyFrom][0] & "&iCurIdTo=" & $devise[$MoneyTo][0] & "&dAmt=" & $Value))
    $sVal = Stringregexp($source, '<td class="heading1black">([[:digit:],.]+(?: Mil| Bil)?)'& $devise[$MoneyTo][1] &'</td>', 3 )
    msgbox(0,"***","MoneyFrom :"& $devise[$MoneyFrom][1] &@CRLF& "MoneyTo :"&$devise[$MoneyTo][0] &@CRLF& $devise[9][0] &@CRLF& $devise[$MoneyTo][1] &@CRLF&$sVal)
    return $sVal[/spoiler]
D'aprés votre exemple je devrais retourner $sVal[0], mais cela me génère une erreur.
Si je retourne $sVal, j'obtiens 1
Avatar du membre
bloodwolff
Membre émérite
Membre émérite
Messages : 655
Enregistré le : ven. 18 avr. 2008 22:36
Localisation : Québec
Status : Hors ligne

Re: [R] Utiliser les expressions régulières

#19

Message par bloodwolff »

Dans ton exemple tu avais oublier un espace dans le pattern ! Je met un \s à la place pour qu'il soit plus visible !

Code : Tout sélectionner

'<td class="heading1black">([[:digit:],.]+(?: Mil| Bil)?)[color=#FF0000]\s[/color]'& $devise[$MoneyTo][1] &'</td>'
Et c'est bien $sVal[0] :wink:
Et arrette de vouvoyer ! :roll:
Compte skype : bloodwolfff
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Utiliser les expressions régulières

#20

Message par pierrotm777 »

Alors , le \s ne change rien !
Par contre je viens de me rendre compte que le tableau n'étant pas complet, il y avait un décalage, je l'ai donc complété et là, et comme il commence à 0, j'ai diminué de -1 dans la fonction, ainsi, la valeur 1 correspond bien à Us et 9 à Euro.

Mais j'ai toujours un résultat de 1 et une erreur si je retourne $sVal[0] au lieu de $sVal.
► Afficher le texte
Répondre