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 :

Recherche d'une expressions régulière pour validation d'une saisie


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2017
    Messages : 2
    Par défaut Recherche d'une expressions régulière pour validation d'une saisie
    Bonjour,
    J'ai programmé en Python une calculatrice en notation polonaise inversée. Je souhaiterais maintenant que la saisie (input) du calcul à effectuer soit valide. Je cherche donc une expression régulière sachant traiter une chaine dont les caractéristiques sont les suivantes : chaque caractère est séparé par un espace ; la chaine commence par une suite de N nombres suivi de N-1 signes opératoires ; le reste de la chaine peut être un mélange de nombres et d'opérations mais si il y a au total dans la chaine T nombres, il doit y avoir T-1 signes opératoires.
    Exemples :
    "2 3 5 + +" est valide
    "2 3 5 6 + - * + " n'est pas valide
    "2 3 5 + + 5 + 6 - 7 8 * -" est valide (7 nombres et 6 opérations)
    Merci pour votre contribution éventuelle,
    Duareb

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 839
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Ca n'a absolument rien à voir avec Python. Faut aller sur un forum dédié aux regex. Mais j'ai du mal à imaginer la regex signifiant "n nombres => n-1 signes". Surtout que "n+1" ou "n-2" signes non plus ça ne doit pas être validé.

    Autre façon de faire: il est évident qu'une saisie incorrecte fera planter le truc. Par exemple avec n signes pour n nombre, tu dois obtenir un IndexError quand tu traites le dernier signe et que tu veux dépiler ta pile vide.
    Donc tu peux passer par un try/except selon la logique suivante: si le truc échoue c'est que la saisie était invalide (façon de faire assez courante en Python quand on ne sait pas faire autrement : on fait et on gère l'erreur)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Pourquoi séparés par un espace ?

  4. #4
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2017
    Messages : 2
    Par défaut Pile pour le calcul en NPI
    En fait les opérations et les nombres sont disposés dans une pile et donc les espaces sont les séparateurs de chaque étage de la pile.
    Par exemple la pile :
    -
    +
    20
    12
    7
    se traduit par "7 12 20 + -"
    La pile devient successivement :
    -
    32 (=20+12)
    7
    puis
    -25 (=7-32)

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 839
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par duareb Voir le message
    En fait les opérations et les nombres sont disposés dans une pile et donc les espaces sont les séparateurs de chaque étage de la pile.
    Oui on connait la polonaise inversée.
    Ce que (à mon avis) voulait dire josmiley c'est que l'espace n'a pas besoin de séparer les opérateurs. L'opération 7 12 20 + - peut aussi s'écrire 7 12 20 +- et être tout aussi lisible par un parseur approprié.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour

    S'il ne s'agit que de compter les opérateurs et les nombres, c'est facile.

    Partons du principe que:
    - le résultat de la saisie est une chaîne (et non une liste)
    - chaque élément, entier ou opérateur, est séparé des autres éléments par un espace
    - le nombre d'opérateurs doit être égal au nombre de nombres moins 1

    Alors:

    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
    x = "3 1 2 + 4 * +"            
    print("Saisie:", x)
     
    liste = x.split()
    print("Liste:", liste)
     
    nboper = 0 # compteur du nombre d'opérateurs
    for elem in liste:
        if elem in "+-*/^":
            nboper += 1
    print("Nombre d'opérateurs:", nboper, "Nombre de nombres:", len(liste)-nboper)        
     
    if nboper!=len(liste)-nboper-1:
        print("faux!")
    else:
        print("ok!")
    ce qui affiche:
    Saisie: 3 1 2 + 4 * +
    Liste: ['3', '1', '2', '+', '4', '*', '+']
    Nombre d'opérateurs: 3 Nombre de nombres: 4
    ok!

Discussions similaires

  1. [PowerShell] Expression Reguliere pour valider l'attribut AD ProxyAddresses
    Par borislotte dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 05/11/2018, 11h55
  2. Expression regex pour valider numéro téléphone en France
    Par lordrt dans le forum Général Java
    Réponses: 11
    Dernier message: 15/12/2013, 07h51
  3. Expression reguliére pour valider un champ
    Par Jacobian dans le forum ActionScript 3
    Réponses: 13
    Dernier message: 14/03/2011, 16h00
  4. [RegExp] expression régulière pour validation email
    Par wwwbillgates dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/08/2010, 17h05
  5. Réponses: 16
    Dernier message: 30/01/2008, 15h11

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