3
respostas

Não achei que a regex ficou legal para celular

A regex que foi informada dá pau se o número testado for um celular, por que considerad o código de país como 3 dígitos, ai não dá muito certo não Qual seria o correto?

3 respostas

Olá Leonardo.

Poderia informar a situação em que o regex proposto não funciona ?

Testei aqui com números de celulares com 8 dígitos e 9 dígitos.

import re


celular_9_digitos = '05511973758356' #celular com 9 digitos
celular_8_digitos = '0551173758356'  #celular com 8 digitos

padrao = "([0-9]{2,3})?([0-9]{2})([0-9]{4,5})([0-9]{4})"

resposta = re.search(padrao, celular_9_digitos)
print('+{}({}){}-{}'.format(resposta.group(1),  resposta.group(2), resposta.group(3), resposta.group(4)))

resposta = re.search(padrao, celular_8_digitos)
print('+{}({}){}-{}'.format(resposta.group(1),  resposta.group(2), resposta.group(3), resposta.group(4)))

E obtive o resultado esperado.

python .\principal.py
+055(11)97375-8356
+055(11)7375-8356

Olhando para o regex, vemos que ele deixa um intervalo de 4 a 5 dígitos ([0-9]{4,5}), garantindo assim que aceita os dois tipos de telefone.

padrao = "([0-9]{2,3})?([0-9]{2})([0-9]{4,5})([0-9]{4})"

Fico no aguardo, bons estudos.

O DDI pode ser informado com 2 ou 3 dígitos. No teste está sempre com 3. Mas se o número informado for celular_9_digitos = '5511973758356' ele dá o retorno +551(19)7375-8356

import re


celular_9_digitos = '5511973758356' #celular com 9 digitos
celular_8_digitos = '551173758356'  #celular com 8 digitos

padrao = "([0-9]{2,3})?([0-9]{2})([0-9]{4,5})([0-9]{4})"

resposta = re.search(padrao, celular_9_digitos)
print('+{}({}){}-{}'.format(resposta.group(1),  resposta.group(2), resposta.group(3), resposta.group(4)))

Olá Leonardo.

Entendi a sua duvida, realmente adicionando essa complexidade de ter de 2 a 3 dígitos de DDI e 8 a 9 dígitos no telefone fica difícil de resolver utilizando apenas um regex simples e recebendo a string do telefone, sem nenhuma referencia como hífen ou parenteses.

Já apareceu uma resposta aqui no fórum que acho que pode te guiar melhor, ela está nesse tópico recomendo que de uma olhada.

Eu tentei bolar alguns regex e o melhor que cheguei foi esse, mas acredito que como tempos muitas variações acaba ficando bem complexo:

import re


DDI_3_celular_9_digitos = '05511993734043' #12 digitos
DDI_2_celular_9_digitos = '5511993734043' #11 digitos
DDI_3_fixo_8_digitos = '0551143619398'  #11 digitos
DDI_2_fixo_8_digitos = '551143619398'  #10 digitos
telefones = [DDI_3_celular_9_digitos, DDI_2_celular_9_digitos,
             DDI_3_fixo_8_digitos, DDI_2_fixo_8_digitos]

padrao = "([0-9]{3}|[0-9]{2})?([0-9]{2})([0-9]{4,5})([0-9]{4})"

for telefone in telefones:
    resposta = re.search(padrao, telefone)
    print('+{}({}){}-{}'.format(resposta.group(1),  resposta.group(2), resposta.group(3), resposta.group(4)))

Utilizei o recurso do operador lógico OR que no regex é representado pela barra | , mas mesmo assim só consegui pegar 3 dos 4 telefones possíveis.

python .\aluno.py  
+055(11)99373-4043
+551(19)9373-4043
+055(11)4361-9398
+55(11)4361-9398

Bons Estudos.