Python regex numéros de téléphone

gab74m Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
    0
    1. gab74m Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
       
      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...
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      je supposais que tu connaissais VBA... quels langages de programmation connais-tu ?
      0
    3. gab74m Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
       
      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...
      0
  2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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.
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      travaille sur des copies de ton fichier !
      0