Python regex numéros de téléphone [Fermé]

Signaler
Messages postés
4
Date d'inscription
vendredi 11 octobre 2019
Statut
Membre
Dernière intervention
11 octobre 2019
-
Messages postés
5432
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 octobre 2020
-
Bonjour,
voilà j'ai un fichier excel comportant par exemple des numéros de téléphone.
Plusieurs utilisateurs ont alimentés ce fichier du coup il y a des problème de format avec les numéros de téléphone. Certains ont mis des espaces, des virgules, des points...
Au final une recherche simple le fichier excel devient problématique.

Puis utiliser du langage python ?

Voici ma regex : ([0]{1})([1-9]{1})[ .,/-]?[1-9]{2}[ .,/-]?[1-9]{2}[ .,/-]?[1-9]{2}[ .,/-]?[1-9]{2}
Est-il possible de reformater tout dans le format que je souhaite ou sinon de faire une recherche en prenant en compte les différences qu'il peut y avoir...

Je ne connais pas trop le langage python...

Merci pour votre réponse

2 réponses

Messages postés
5432
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 octobre 2020
906
Salut gab74m,

Ta regexp
"([0]{1})([1-9]{1})[ .,/-]?[1-9]{2}[ .,/-]?[1-9]{2}[ .,/-]?[1-9]{2}[ .,/-]?[1-9]{2}"


me paraît trop restrictive : elle suppose un numéro à 10 chiffres (quid des numéros courts ou des numéros étrangers), qui commence obligatoirement par 0, elle ne matche pas les numéros où il y a un zéro ailleurs que dans le premier chiffre, elle ne matche pas s'il y a un séparateur ailleurs qu'entre des groupes de 2 chiffres, elle ne matche pas s'il y a deux caractères séparateurs et non un seul,...

Je pense que tu te compliques la vie et que ce que tu devrais faire c'est simplement prendre chaque numéro et retirer tous les caractères qui ne sont pas des chiffres de 0 à 9.

Ensuite, mettre ton propre format, si cela a un sens.

Tu n'as pas besoin des regexp pour cela n'y d'apprendre un nouveau langage et le VBA de ton Excel suffit.

Pour les numéros internationaux, il peuvent être précédés d'un + et du préfixe international du pays, je ne pense pas que tu devrais retirer le plus. Les utilisateurs sont aussi susceptibles d'entrer des numéros internationaux en les précédant de 00 (qui, en France, est équivalent au +). Si tu traites des numéros internationaux, il faudra aussi être prudent dans leur traitement, car il comportent parfois des chiffres à ne pas composer, qui sont mis entre parenthèses (ils ne sont utiles que dans les appels internes au pays, comme le premier 0 dans les numéros français selon le plan de numérotation actuel). Bref, pour ces numéros, à moins que tu saches très exactement ce que tu fais, tu devrais probablement t'abstenir de les modifier.

Dal
Messages postés
4
Date d'inscription
vendredi 11 octobre 2019
Statut
Membre
Dernière intervention
11 octobre 2019

ok super merci pour ta réponse précise...
As-tu un exemple de scrypt VBA qui me permettrai du coup de retirer tout ce qui est "-.,*/".
Je ne connais pas trop le VBA et il me faut une solution automatique par rapport au nombre de données...
Messages postés
5432
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 octobre 2020
906
je supposais que tu connaissais VBA... quels langages de programmation connais-tu ?
Messages postés
4
Date d'inscription
vendredi 11 octobre 2019
Statut
Membre
Dernière intervention
11 octobre 2019

Ben pas grand chose... en langage html, php mais basique... J'ai commencé à regarder python mais vraiment pas gd chose... C'est pour ça que je pensais qu'une REGEX serait plus facile pour moi d’utilisation mais je me heurte à ma méconnaissance du vba...
Messages postés
5432
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 octobre 2020
906
Tu peux donc faire cela en VBA sous Excel.

En supposant que tes numéros soient dans une colonne, comme ceci :


Tu peux créer une macro VBA comme ceci :

Sub Ccm36253824()
    Dim cellRange As Range
    Set cellRange = Range("C5:C9")  ' adapter
    
    ' Parcourir les lignes
    For i = 1 To cellRange.Count
        Dim st As String
        Dim stmod As String
        Dim c
        
        ' Récupérer la valeur
        st = cellRange.cells(i, 1).Value
        stmod = ""

        ' Si ce n'est pas un numéro international
        If Mid(st, 1, 2) <> "00" And Mid(st, 1, 1) <> "+" Then
            For j = 1 To Len(st)
                ' Parcourir les caractères et ne garder que ce qui
                ' représente des chiffres
                c = Mid(st, j, 1)
                If c >= "0" And c <= "9" Then
                    stmod = stmod & c
                End If
            Next
            ' Stocker cela sous forme de texte
            cellRange.cells(i, 1).Value = stmod
            cellRange.cells(i, 1).NumberFormat = "@"
        Else
            ' Si c'est un numéro international, on le signale
            MsgBox "En " + CStr(i) + " : " + st + " est un numéro international, on ne fait rien"
        End If
    Next
End Sub


La macro va parcourir les cellules de la plage indiquée et retirer tous caractères autres que des chiffres, et ne rien faire si elle pense avoir affaire à un numéro international, avec un message comme ceci :


Le résultat sur ce test donne au final :


Dal
Messages postés
5432
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 octobre 2020
906
Hmm, il y a une erreur, le zéro initial est supprimé car le texte est interprété comme un chiffre en ligne 26. Il faut juste inverser les lignes 26 et 27 pour d'abord fixer le format de la cellule et ensuite mettre le numéro de téléphone dedans.
Messages postés
5432
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 octobre 2020
906
travaille sur des copies de ton fichier !