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 :

Récupérer un nombre dans une chaîne de caractères


Sujet :

Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 8
    Points
    8
    Par défaut Récupérer un nombre dans une chaîne de caractères
    Bonjour à tous,
    malgré mes recherches je n'ai pas trouvé exactement ce que je veux.

    Explications : j'ai un fichier texte contenant des noms suivis de numéro.

    jean789
    maurice2
    gustave34

    Je souhaiterais mettre à part les noms (donc les lettres) pour connaitre ensuite quel est le nombre le plus grand.

    Dans mon exemple c'est jean789.

    Pour l'instant j'essaie de trouver le nombre de lignes du fichier texte, puis de comparer ligne par ligne les caractères, mais j'avoue que je suis un peu perdu... Quelqu'un aurait-il une solution ?

  2. #2
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    avec les expressions régulières:

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import re
    re.findall('\d+', 'jean789')[0]  ## 789

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Je te remercie, ça m'a beaucoup aidé !
    Cependant, il ne me reste plus qu'une petite chose à regler : quand je lui demande de comparer les nombre entre eux, tout se passe bien jusqu'a la moitié de ma liste, et d'un coup, il me prend comme resultat final un chiffre très petit alors que je lui demande de me trouver le plus grand !

    Sur un fichier.txt de 13 lignes, il me donne comme resultat 'ggg6'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    michel1
    jean101
    jean10
    jean200
    jean159
    jean100
    jean199
    jean144
    michel1
    jean104
    ggg6
    fghfghfg1304
    nounou2
    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
    import re
     
    objet = open('test3b.txt', 'r')
    compteur,resultat_nb = 0,0
     
    while compteur < 13:
     
    	var = objet.readline()
    	var_nb = re.findall('\d+', var)[0]
     
    	if var_nb > resultat_nb:
    		resultat_nb = var_nb
    		resultat = var
     
    	compteur = compteur+1
     
    print 'resultat_nb = ',resultat_nb
    print 'resultat = ',resultat
     
    objet.close()

  4. #4
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    en fait, la fonction de retourne un string, donc il faut caster en int pour qu'il compare des entiers et non des des strings

    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_nb = int(re.findall('\d+', var)[0])

  5. #5
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Citation Envoyé par Guigui_ Voir le message
    en fait, la fonction de retourne un string, donc il faut caster en int pour qu'il compare des entiers et non des des strings

    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_nb = int(re.findall('\d+', var)[0])
    Oula pas de cast en python mais une conversion

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Effectivement, il fallait bien convertir mon string en int

    Par contre, dès qu'il y a beaucoup de lignes (avant je testais avec 15 lignes), ca bug avec ce message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      File "C:/Python/python.py", line 9, in <module>
        var_nb = int(re.findall('\d+', var)[0])
    IndexError: list index out of range
    Je précise que le fichier final à 305 lignes.

    Le code complet au cas où :

    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
    import re
     
    objet = open('users.txt', 'r')
    compteur,resultat_nb = 0,0
     
    while compteur < 305:
     
    	var = objet.readline()
    	var_nb = int(re.findall('\d+', var)[0])
     
    	if var_nb > resultat_nb:
    		resultat_nb = var_nb
    		resultat = var
     
    	compteur = compteur+1
     
    print 'resultat_nb = ',resultat_nb
    print 'resultat = ',resultat
     
    objet.close()
    J'ai essayé avec 'for ... in ...' => même message d'erreur.

  7. #7
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    C'est que tu dois avoir des lignes qui ne contiennent pas de nombre (peut-être des lignes vide ?)

    remplace par quelquechose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var_nb = re.findall('\d+', var)
    if len(var_nb) ==0: continue
    else: var_nb = int(var_nb[0])

  8. #8
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Effectivement, je crois qu'il y a des lignes sans numéros. Je teste ça et te tiens au courant.
    En tout cas merci beaucoup !

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

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Sans utiliser le module re:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    noms = [[ligne.strip()] for ligne in open('noms.txt')]
     
    for nom in noms:
        nb = int(''.join([nb for nb in nom[0] if nb in '0123456789'] or '0'))
        nom.insert(0, nb)
     
    numLigne = noms.index(max(noms))
    print "%s ligne %d" % (noms[numLigne][1], numLigne)

  10. #10
    Futur Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Effectivement, le module re est très intéressant, mais la solution de pacificator me plait beaucoup !
    En tout cas, je vous remercie tous pour votre réactivité et vos conseils !

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/07/2008, 16h15
  2. Réponses: 2
    Dernier message: 24/03/2008, 23h00
  3. [RegEx] Récupérer un prix dans une chaîne de caractère
    Par Tazerty dans le forum Langage
    Réponses: 1
    Dernier message: 11/03/2008, 07h41
  4. [MySQL] Récupérer un nombre dans une chaîne
    Par Phenol dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/03/2007, 21h28
  5. Nombre d'occurences dans une chaîne de caractères
    Par Olivier14 dans le forum Langage
    Réponses: 4
    Dernier message: 20/03/2006, 19h11

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