Retourner deux valeurs

Résolu
syntmk Messages postés 13 Date d'inscription vendredi 12 mars 2021 Statut Membre Dernière intervention 30 mars 2021 - 18 mars 2021 à 20:40
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 - 27 mars 2021 à 07:29
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

Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
18 mars 2021 à 21:17
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...
2
syntmk Messages postés 13 Date d'inscription vendredi 12 mars 2021 Statut Membre Dernière intervention 30 mars 2021
18 mars 2021 à 21:33
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
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
19 mars 2021 à 08:40
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
1
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
19 mars 2021 à 08:50
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
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
21 mars 2021 à 23:47
Et la regex que je t'ai proposée ne te convenait pas?
1
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
22 mars 2021 à 05:58
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?

1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
27 mars 2021 à 07:29
Tant mieux.

Pense à marquer le sujet résolu
1
syntmk Messages postés 13 Date d'inscription vendredi 12 mars 2021 Statut Membre Dernière intervention 30 mars 2021
18 mars 2021 à 23:16
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.
0
syntmk Messages postés 13 Date d'inscription vendredi 12 mars 2021 Statut Membre Dernière intervention 30 mars 2021
18 mars 2021 à 23:18
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.
0
syntmk Messages postés 13 Date d'inscription vendredi 12 mars 2021 Statut Membre Dernière intervention 30 mars 2021
Modifié le 22 mars 2021 à 10:20
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"
0
syntmk Messages postés 13 Date d'inscription vendredi 12 mars 2021 Statut Membre Dernière intervention 30 mars 2021
Modifié le 22 mars 2021 à 10:20
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



0
syntmk Messages postés 13 Date d'inscription vendredi 12 mars 2021 Statut Membre Dernière intervention 30 mars 2021
27 mars 2021 à 00:42
Merci :) ! Vos réponses m'ont été très utiles et ont permis de résoudre mon problème.

Grand Merci !
0
Rejoignez-nous