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
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
- 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
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
596
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
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
596
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
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
596
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
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
596
21 mars 2021 à 23:47
Et la regex que je t'ai proposée ne te convenait pas?
1
Whismeril
Messages postés
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
596
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
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
596
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