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

Python Discussion :

formater un string


Sujet :

Python

  1. #1
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Par défaut formater un string
    Salut,

    j´aimerai couper ou formater le string suivant:

    i='1.2.840.113747.20040531165138.3388.3000.672' de facon à avoir un nouveau string j='3000.672' ou j='3000.672'. Je ne voudrai pas considerer les chiffres d´avant.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut
    Alors morty, si j'ai bien compris tu ne veux que la fin de ton nombre donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    i='1.2.840.113747.20040531165138.3388.3000.672'
    j=i[35:]      #j= la chaine 'i' du charactere 35 jusqu'à la fin
    Sachant qu'en Python tu peux aussi compter les chaines à l'envers (de droite à gauche) tu peux aussi faire comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    i='1.2.840.113747.20040531165138.3388.3000.672'
    j=i[-8:]      #j= la chaine 'i' du charactere -8 jusqu'à la fin

  3. #3
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 78
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Pour le problème posé, et si on a la flemme de compter jusqu'à 35:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    index=j.find("3000")
    j=j[index:]
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    C’est une question de conjugaison. J’ai essayé d’être humoristique (un humour mi-figue mûre, mi-raisin vert) pour ne pas jouer au père Vaugelas. Je suis ahuri et parfois excédé de voir certaines fautes d’orthographes faites sur des points d'un usage quotidien constant.

  5. #5
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Si le but est de récuperer les deux derniers nombres, je propose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    i='1.2.840.113747.20040531165138.3388.3000.672'
    '.'.join(i.split('.')[-2:])

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je pense, et j’espère, cependant, que morty cherche une solution plus générale.

    Étant réduit à conjecturer ce qu’est le cas général pour toi, morty, je suppose que tu cherches à capturer le deux derniers des groupes de nombres qui sont séparés par des points et je propose donc deux possibilités:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    i='1.2.840.113747.20040531165138.3388.3000.672'
     
    print i[i[0:i.rfind('.')].rfind('.')+1:]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    i='1.2.840.113747.20040531165138.3388.3000.672'
     
    print '.'.join(i.split('.')[-2:])

  7. #7
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Par défaut
    Merci pour toutes vos reponses...Un merci particulier à Eyquem pour son apport pythonesque et linguistique.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Une regex est sans doute le mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import re
    pat = re.compile('\d+?\.\d+\Z')
    print pat.search(i).group()

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Me rappelant de la remarque suivante de Antoine935,
    http://www.developpez.net/forums/d76...e/#post4427182
    j'ai pensé qu’il devait être possible d’optimiser la recherche par regex en parcourant la chaîne à partir de la fin.

    Bingo: ça diminue le temps de 45%.



    Dans la foulée, j’ai testé les autres solutions.

    Surprise: la méthode d’apparence compliquée avec rfind() est la plus rapide. Demi-surprise en fait car si j’ai pensé à cette solution c’est que je savais que les méthodes find() sont ultra véloces.


    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
    i='1.2.840.113747.20040531165138.3388.3000.672'
     
    import re
    from timeit import Timer
     
    repet = 5
    iterat = 1000
    a = Timer("pat.search(i).group()",'from __main__ import pat,i').repeat(repet,iterat)
    b = Timer("i[[ x for x in xrange(len(i)) if i[x]=='.'][-2]+1:]",'from __main__ import pat,i').repeat(repet,iterat)
    c = Timer("patinv.match(i[::-1]).group()[::-1]",'from __main__ import patinv,i').repeat(repet,iterat)
    d = Timer("'.'.join(i.split('.')[-2:])",'from __main__ import pat,i').repeat(repet,iterat)
    e = Timer("i[i[0:i.rfind('.')].rfind('.')+1:]",'from __main__ import pat,i').repeat(repet,iterat)
     
     
    print "pat.search(i).group()\t\t\t",'  '.join([str(u)[0:6] for u in a])
    print
    print "i[[ positions de '.'][-2]+1:]\t\t",'  '.join([str(u)[0:6] for u in b])
    print
    print "patinv.match(i[::-1]).group()[::-1]\t",'  '.join([str(u)[0:6] for u in c])
    print
    print "'.'.join(i.split('.')[-2:])\t\t",'  '.join([str(u)[0:6] for u in d])
    print
    print "i[i[0:i.rfind('.')].rfind('.')+1:]\t",'  '.join([str(u)[0:6] for u in e])

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    pat.search(i).group()			0.1168  0.1203  0.1252  0.1202  0.1200
     
    i[[ positions de '.'][-2]+1:]		0.0681  0.0652  0.0673  0.0651  0.0694
     
    patinv.match(i[::-1]).group()[::-1]	0.0204  0.0200  0.0231  0.0208  0.0209
     
    '.'.join(i.split('.')[-2:])		0.0148  0.0128  0.0128  0.0127  0.0161
     
    i[i[0:i.rfind('.')].rfind('.')+1:]	0.0092  0.0093  0.0100  0.0092  0.0092


    Une regex est sans doute le mieux
    Tu parles. C'est vite dit.

  10. #10
    Membre éprouvé
    Inscrit en
    Mars 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2003
    Messages : 127
    Par défaut
    J'ai pas testé mais la regex est peut être un peu plus rapide si on la compile avant, c'est intéressant seulement si on souhaite faire cette manipulation quelque dizaine ou centaine de fois je pense

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    C'est le cas. Je ne sais pas comment il se fait que les regex ne se trouvent pas dans le code mais les les résultats ont été obtenus avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pat = re.compile('\d+\.\d+\Z')
    patinv = re.compile('\A\d+\.\d+')
    Ces regex sont importées dans chaque instance de Timer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'from __main__ import pat,i'
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'from __main__ import patinv,i'
    Je pousse le souci de bien comparer jusqu'à importer une regex dans toutes les instances, même celles qui n’en ont pas besoin pour exécuter la ligne de code.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    Eyquem, peux-tu me dire comment tu obtiens les temps d'éxécution de ton code ? Merci

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Salut scheme,

    Le code que j’ai mis dans le message #11 ne fonctionne pas si on le lance après l’avoir simplement copié-collé parce que, pour une raison que j’ignore, il lui manque les deux lignes qui créent les deux regex utilisées par deux des méthodes.

    Il faut lui ajouter ces deux lignes, qui sont
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pat = re.compile('\d+\.\d+\Z')
    patinv = re.compile('\A\d+\.\d+')



    Soit dit en passant, quand une chaîne qui contient un point. est AFFICHÉE, le point est considéré par le bidule qui affiche (stdout ?) comme...un point. Normal.

    Mais quand une chaîne qui contient . est passée à la fonction RE.COMPILE(), celle-ci saisit le point et le traduit par “n’importe quel caractère sauf \n“.

    Pour signifier à re.compile() que, dans la regex qu’elle construit, elle doit coder un vrai caractère point . tout simple et uniquement ce caractère, il faut échapper le point de la chaîne par le signe \ placé devant.

    Ce \ signifie un échappement au sein de re.compile(), pas dans la chaîne. Dans une chaîne, \ échappe d’autres trucs mais pas le point.

    Si on met \. dans la RE passée à re.compile(), on produit les résultats voulus quand il y a uniquement un . dans i. Pour un séparateur ; ou *, ça ne marchera pas.

    Alors que si on met un point simple . dans la RE, ça marchera quel que soit le séparateur.

    J’ai préféré mettre \. pour n’induire personne en erreur.

    NB : pour moi RE = la chaîne passée à re.compile()







    Je conseille aussi d’ajouter des lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    print pat.search(i).group()
    print i[[ positions de '.'][-2]+1:]
    # etc
    en copiant-collant les expressions qui sont dans les Timer( ) pour s’assurer qu’elles ne sont pas erronées et qu'elles donnent bien toutes le même résultat.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    Merci de ta réponse Eyquem, mais en fait je cherchais plus à savoir comment otenir les temps de réponse, ce qu'il y a à droite en rose dans le message #11

  15. #15
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Eh bien il suffit de copier-coller le code du message #11 (en y ajoutant les deux lignes manquantes) et de faire tourner....





    Maintenant si tu veux comprendre ce qui se passe....



    Une instance de Timer() possède deux méthodes de mesure de temps:

    - timeit(iterat) qui produit un float donnant le temps en secondes du nombre d’itérations iterat

    - repeat(repet , iterat) qui produit une liste de floats donnant le temps en secondes du nombre d’itérations iterat ; repet est le nombre de fois où la mesure de temps avec iterat itérations a été faite, et c’est donc le nombre de floats dans la liste résultat



    Dans mon code je fais un traitement de chaîne sur les floats transformés en string par str(u) de façon à ne faire afficher que les premiers chiffres caractéristiques des floats. C’est pour l’affichage, afin que tous les floats d’une liste tiennent sur une seule liste (ça dépend aussi du nombre repet).

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/12/2014, 18h40
  2. [XSL-FO] comment formater les string
    Par bwwilly dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 28/06/2007, 15h16
  3. [XSLT 2.0]formater un string
    Par fanette dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 26/03/2007, 10h38
  4. Formater une string en tableau de byte
    Par lamoufle dans le forum C
    Réponses: 5
    Dernier message: 22/11/2006, 16h51
  5. [Debutant]Formater un string pour une url
    Par maxxou dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 22/03/2004, 16h17

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