Python regex numéros de téléphone

Messages postés
4
Date d'inscription
vendredi 11 octobre 2019
Statut
Membre
Dernière intervention
11 octobre 2019
- - Dernière réponse : [Dal]
Messages postés
5248
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 octobre 2019
- 11 oct. 2019 à 15:11
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
Afficher la suite 

2 réponses

Messages postés
5248
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 octobre 2019
806
0
Merci
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
gab74m
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...
[Dal]
Messages postés
5248
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 octobre 2019
806 -
je supposais que tu connaissais VBA... quels langages de programmation connais-tu ?
gab74m
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...
Commenter la réponse de [Dal]
Messages postés
5248
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 octobre 2019
806
0
Merci
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
[Dal]
Messages postés
5248
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 octobre 2019
806 -
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.
[Dal]
Messages postés
5248
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 octobre 2019
806 -
travaille sur des copies de ton fichier !
Commenter la réponse de [Dal]