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 :

manipulation d'une chaine de caractere


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut manipulation d'une chaine de caractere
    Bonjour,

    J'ai une chaine de caractere de ce type:

    pinout_eat_pec :"PACKVDD=vdd gnd=PACKGND";

    et je voudrais en déduire que PACKVDDest bien égale à vdd et idem pour PACKGND.....

  2. #2
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonsoir,
    Une des méthodes serait la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    txt = "PACKVDD=vdd gnd=PACKGND"
     
    ens = txt.split(" ")
    res = [i.split("=") for i in ens]
    dres = dict(res)
    print res
    print dres
    L'autre consisterait en l'utilisation des expressions regulières (c'est pas ma tasse de thé).

    A +
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut
    soit c'est trop précis est ce qui suit est une solution ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    txt = "PACKVDD=vdd gnd=PACKGND"
    "PACKVDD=vdd" in txt
    "gnd=PACKGND" in txt
    soit la question(ou le problème) n'est pas assez "générale".

    on manque d'info quoi...

  4. #4
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Pourrais-tu confirmer la logique suivante :
    • dans la(les) chaîne(s) il y a une ou plusieurs égalités sur une même ligne
    • chacune de ces égalités comporte un nom en majuscules et un nom en minuscule
    • chacune de ces parties de l'égalité peuvent être placés indifféremment d'un côté ou de l'autre du signe =
    • la partie minuscule d'une égalité doit être les trois dernière lettres de l'autre partie en majuscule


    Si telle est bien la logique, ceci fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> def valid(txt):
    	check = lambda names: names[0].islower() and names[1].isupper() and names[0]==names[1][-3:].lower()
    	for names in (egal.split('=') for egal in txt.split()):
    			if check(names) or check(names[::-1]):
    				yield set(names)
     
     
    >>> txt="PACKVDD=vdd gnd=PACKGND BIDON=foo"
    >>> list(valid(txt))
    [set(['PACKVDD', 'vdd']), set(['gnd', 'PACKGND'])]

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    oui N.Tox ta logique est bonne mais ton programme ne fais pas exactement se que je veux......J'aimerais faire correspondre par exemple PACKVDD à vdd mais la c'est pas possible puisque j'ai une fois PACKVDD à gauche et une autre fois PACKGND à droite...

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    afranck64 ton programme marche bien et j'ai en sorti le dictionnaire suivant:

    {'PADVDD': 'vdd', 'gnd': 'PADGND'}

    mais j'aimerais plutot obtenir cela afin de pouvoir exploiter ce dico:

    {'PADVDD': 'vdd', 'PADGND': 'gnd'}

  7. #7
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Salut,

    pour le code que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    txt = "PACKVDD=vdd gnd=PACKGND"
     
    ens = txt.split(" ")
    res = []
    for i,elt in enumerate(ens):
        if i%2==0:
            res.append(elt.split("="))
        else:
            res.append(reversed(elt.split("=")))
    dres = dict(res)
    print res
    print dres
    Mais je te conseille de t'assurer que tu ne peux pas faire autrement. Un meilleur ordonancement des éléments lors de la formation de la liste ...
    C'est toujours plus compliqué de rectifier le tir après.
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    j'utilise ce code qui marche bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    txt = "PACKVDD=vdd gnd=PACKGND"
     
    ens = ens.strip().split()
    res = [i.split("=") for i in ens]
    for elem in res:
    if elem[0] == pad:
    return elem[1]
    elif elem[1] == pad:
    return elem[0]
    bon c'est pas ce qui a de plus élégant comme programme mais sa a le mérite de faire ce que je veux

  9. #9
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Citation Envoyé par kali38 Voir le message
    oui N.Tox ta logique est bonne mais ton programme ne fais pas exactement se que je veux......J'aimerais faire correspondre par exemple PACKVDD à vdd mais la c'est pas possible puisque j'ai une fois PACKVDD à gauche et une autre fois PACKGND à droite...
    les résultats envoyé par la fonction que je t'ai proposée sont des set, ces dernier n'ont pas d'ordre, il suffit donc de créer une fonction qui traite ces set pour retourner un résultat ordonné à ta convenance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> def valid(txt):
    	check = lambda names: names[0].islower() and names[1].isupper() and names[0]==names[1][-3:].lower()
    	for names in (egal.split('=') for egal in txt.split()):
    			if check(names) or check(names[::-1]):
    				yield set(names)
     
     
    >>> def get_valid_equalities_as_dict(txt):
    	return dict([sorted(s,key=str.isupper,reverse=True) for s in valid(txt)])
     
    >>> txt="PACKVDD=vdd gnd=PACKGND BIDON=foo"
    >>> get_valid_equalities_as_dict(txt)
    {'PACKVDD': 'vdd', 'PACKGND': 'gnd'}
    En fait, dans ce cas précis, yielder des sets n'apporte strictement rien .
    Remplacer donc la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    yield set(names)
    #par
    yield names
    s’avérera plus efficace

    EDIT:
    Ou bien au lieu de faire une deuxième fonction, adapter la première en un condensé:
    • version_longue :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      >>> def valid_equalities(txt):
      	check = lambda names: names[0].islower() and names[1].isupper() and names[0]==names[1][-3:].lower()
      	for names in (egal.split('=') for egal in txt.split()):
      		if check(names) or check(names[::-1]):
      			return sorted(names, key=str.isupper, reverse=True)
       
       
      >>> dict(valid_equalities(txt))
      {'PACKVDD': 'vdd', 'PACKGND': 'gnd'}
    • version_courte :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      >>> def valid_equalities(txt):
      	check = lambda names: names[0].islower() and names[1].isupper() and names[0]==names[1][-3:].lower()
      	return (sorted(names, key=str.isupper, reverse=True) for names in (egal.split('=') for egal in txt.split()) if check(names) or check(names[::-1]))
       
      >>> dict(valid_equalities(txt))
      {'PACKVDD': 'vdd', 'PACKGND': 'gnd'}

  10. #10
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Salut,

    @Kali38
    Avec mon dernier code je suppose que les groupes a indice pair sont bien ordonne et ceux a indices impair ne le sont pas.

    Celui de N.Tox, je pense tiens compte du fait que les groupes debutants par des majuscules le sont, et les autres non.

    @N.Tox
    Je ne comprends pas dans ton code a quel moment la selection du troisieme groupe est rejetee.
    >>> txt="PACKVDD=vdd gnd=PACKGND BIDON=foo"
    >>> get_valid_equalities_as_dict(txt)
    {'PACKVDD': 'vdd', 'PACKGND': 'gnd'}
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  11. #11
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    grâce à la fonction suivante, plus particulièrement le passage en rouge:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    check = lambda names: names[0].islower() and names[1].isupper() and names[0]==names[1][-3:].lower()
    mais si le mot en maj doit toujours commencer par 'PACK', alors faut remplacer cette fonction par celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    check = lambda names: names[0].islower() and names[1].isupper() and names[1]=='PACK'+names[0].upper() and len(names[0])==3

Discussions similaires

  1. manipulation d'une chaine de caractere
    Par prince_bouja dans le forum Débuter
    Réponses: 2
    Dernier message: 14/06/2010, 13h26
  2. manipuler une chaine de caractere
    Par l_achraf dans le forum VB.NET
    Réponses: 4
    Dernier message: 15/05/2009, 18h47
  3. Manipulation d'une chaine de caracteres ASP
    Par Brestasp dans le forum ASP
    Réponses: 1
    Dernier message: 18/10/2007, 15h13
  4. Manipulation d'une chaine de caracteres
    Par C.R.E.A.M dans le forum Excel
    Réponses: 2
    Dernier message: 17/08/2007, 12h08
  5. Manipuler une chaine de caracteres
    Par virtu67 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 28/12/2006, 16h31

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