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?
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?
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.