Retourner deux valeurs [Résolu]

Signaler
Messages postés
13
Date d'inscription
vendredi 12 mars 2021
Statut
Membre
Dernière intervention
30 mars 2021
-
Messages postés
15833
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2021
-
Bonjour :) ,

J'ai mon algorithme qui marche, mais j'aimerai apporté une modification.
Ma fonction recherche dans un texte dans le message des client tout nombre de 5 à 4 chiffre de entre 60000 - 1000 (ex: 1001) si le client demande la commande 1005 comme exemple et me le retourne.

Mais je voudrai que si après avoir analyser le texte et trouve deux nombre de 5 à 4 chiffre de entre 60000 - 1000 (ex: 1001 et 3005) que cela me retourne tout les deux.


def detect_order_name(message):
    for text in [message["subject"],message["data"]]:
        order_name = "not found"
        match = re.search(r"\D(\d{4,5})\D","{}{}{}".format("a",text,"a"))
        if match:
            num = int(match.group(1))
            if num < 60000 and num > 1000:
                order_name = str(num)
                break
    return order_name


9 réponses

Messages postés
15833
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2021
532
Bonjour

tu peux retourner une liste, s'il y a un résultat, il n'y aura qu'une valeur dans la liste, s'il y en a 2, y'en aura 2, s'il y en a 3, etc...
Messages postés
13
Date d'inscription
vendredi 12 mars 2021
Statut
Membre
Dernière intervention
30 mars 2021

au lieu de me récupérer normalement toutes les valeurs, elle me récupère qu'une seule même s'il y en a plusieurs ...
ça me prend un peu la tête
Messages postés
15833
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2021
532
Déjà ta regex n'est pas optimisée.

Va voir cet exemple https://regex101.com/r/9bGzWC/1 qui semble répondre à ton besoin
(\D|^)(60000|[12345]\d\d\d\d|[123456789]\d\d\d)(\D|$)

J'ai pris la précaution d'ajouter |^ au début et |$ à la fin, sinon, une correspondance en tout début ou toute fin de texte ne serait pas prise car il n'y a pas de caractère non numérique avant ou après.
J'ai supposé que tu n'as pas utilisé \b car par exemple a12345b doit retourner 12345.

Ensuite pour trouver toutes les occurrences d'un modèle, voir cette question
https://stackoverflow.com/questions/4697882/how-can-i-find-all-matches-to-a-regular-expression-in-python
Messages postés
15833
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2021
532
On peut même écrire
(?:\D|^)(60000|[12345]\d\d\d\d|[123456789]\d\d\d)(?:\D|$)
ce qui évite que les caractères avant et après soient mis dans un groupe
Messages postés
15833
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2021
532
Et la regex que je t'ai proposée ne te convenait pas?
Messages postés
15833
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2021
532
Mais tu n'as pas besoin de tester si c'est entre 1000 et 60000 la regex le fait.
As tu au moins pris la peine d'aller voir l'exemple que je t'avais mis sur regex101?

Messages postés
15833
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2021
532
Tant mieux.

Pense à marquer le sujet résolu
Messages postés
13
Date d'inscription
vendredi 12 mars 2021
Statut
Membre
Dernière intervention
30 mars 2021

La question (peut-être un peu mal formulée) j'aimerai passer de 1 à N plutôt que de passer de 1 à 2 exactement. Donc liste plutôt que tuple.
Messages postés
13
Date d'inscription
vendredi 12 mars 2021
Statut
Membre
Dernière intervention
30 mars 2021

Ma fonction s’arrête dès qu’elle trouve une valeur convenable.
Si il y en a plusieurs, elle va sortir la première.
Messages postés
13
Date d'inscription
vendredi 12 mars 2021
Statut
Membre
Dernière intervention
30 mars 2021

j'ai revu l'algorithme pour virer la condition qui fait qu'elle s'arrête de remplir le tuple/liste

Est-ce vrai ?

def detect_order_name2(message):
    text = message["subject"] + message["data"]
    order_name = list()
    lstr_order_name = re.findall(r"\d+", text)
    lint_order_name = [int(x) for x in lstr_order_name]
    for num in lint_order_name :
        if num < 60000 and num > 1000:
            order_name.append(num)
    print(order_name)
    if order_name :
        return order_name
    else :
        return "not_found"
Messages postés
13
Date d'inscription
vendredi 12 mars 2021
Statut
Membre
Dernière intervention
30 mars 2021

Si si ça me convient aussi.

J'ai essayé. voici :




def detect_order_name(message):
    for text in [message["subject"],message["data"]]:
        order_name = "not found"
        match = re.search(r\D|^)(60000|[12345]\d\d\d\d|[123456789]\d\d\d)(\D|$)
        if match:
            num = int(match.group(1))
            if num < 60000 and num > 1000:
                order_name = str(num)
                break
    return order_name



Messages postés
13
Date d'inscription
vendredi 12 mars 2021
Statut
Membre
Dernière intervention
30 mars 2021

Merci :) ! Vos réponses m'ont été très utiles et ont permis de résoudre mon problème.

Grand Merci !