Eu criei esse padrão que consegue encontrar diversas formatos de telefone, porém pode acabar validando algumas sequências numéricas incorretamente.
padrao = re.compile(r"(?:\+?\d{2,3}[ ]{0,4})?(?:(?:\(0?\d{2}\)|0?\d{2})[ ]{0,4})?(?:9[ .-]?)?\d{4}[ .-]?\d{4}")
fones = [
"(092)9 4313-3030 ",
"21 38323344",
"+5535992321234",
"155 8799232-3344",
"013 9.7832-5588",
"(45) 9 7832-9932",
"055 032 99232 7711",
]
Explicação:
(?:)
: Não-captura de grupo, permite que o findall() seja usado sem retornar apenas os grupos.\+?
: Prefixo de codigo internacional, escapado com a barra invertida, e considerado elemento opcional pelo?
.\d{2,3}
: Seleciona apenas 2 ou 3 digitos, equivalente à[0-9]
.[ ]{0,4}
: Separa DDI, e DDD com até 4 espaços. O número maioir pode ser apenas 2, caso o usuário tenha digitado dois espaços sem querer, ao invés de um.\(0?\d{2}\)|0?\d{2}
: Encontra DDD nos formatos (12), (012) OU 12, 012, mas não 12).9?[ .-]
: Digito 9 pode ser seguido por um espaço, ponto ou hífen, eu não existir.
Se encontrar algum erro ou sabe de uma regra especial depois do 9 opcional, me avisem. :)