Regex ou stringr

Olá,

Tenho um vetor que possu CPF’s e preciso acrescentar dois 0’s no início do CPF quando o CPF tem 9 dígitos e quando ele tem 11 dígitos faço nada.

Ou seja, quando for 123589658 quero que seja 00123589658.

Aproveitando… Como seria pegar somente números em um vetor que está da seguinte maneira:

a <- c("O CPF dele é 47896585", "CPF é: 47589625698", "123658987 é esse CPF", "Cpf é: 25698568")

Eu fiz na raça com stringr::str_replace_all pegando os distinct da variável, mas queria um jeito mais fácil.

Agradeço desde já Rzeires.

2 curtidas

Oi Fe! bom dia!

Para criar as regras, eu faria com dplyr::case_when().
Para extrair os números, como nesse vetor os números são apenas os CPFs, eu usaria o readr::parse_number().

Exemplo dessas funções com o código que vc enviou:

a <-
  c("O CPF dele é 47896585",
    "CPF é: 47589625698",
    "123658987 é esse CPF",
    "Cpf é: 25698568")

a |>
  # transformar em tibble
  tibble::enframe() |>
  dplyr::mutate(
    # extrair os números
    numeros = readr::parse_number(value),
    # contar o número de digitos iniciais
    n_digitos_inicial = nchar(numeros),
    # criar coluna de cpf com case_when
    cpf = dplyr::case_when(
      # se tiver 11 digitos, só mantem os numeros como texto
      n_digitos_inicial == 11 ~ as.character(numeros),
      # se tiver 9 digitos, só mantem os numeros como texto
      n_digitos_inicial == 9 ~ paste0("00", as.character(numeros)),
      TRUE ~ "REVISAR AS REGRAS"
    ),
    
    
    cpf_forma2 = dplyr::case_when(
      # se tiver 11 digitos, só mantem os numeros como texto
      n_digitos_inicial == 11 ~ as.character(numeros),
      # se tiver menos que 11 digitos, preencher do lado esquerdo com 0
      n_digitos_inicial < 11 ~ paste0(strrep("0", 11 - n_digitos_inicial), numeros),
      TRUE ~ "REVISAR AS REGRAS"
    )
  )
#> # A tibble: 4 × 6
#>    name value                     numeros n_digitos_inicial cpf       cpf_forma2
#>   <int> <chr>                       <dbl>             <int> <chr>     <chr>     
#> 1     1 O CPF dele é 47896585    47896585                 8 REVISAR … 000478965…
#> 2     2 CPF é: 47589625698    47589625698                11 47589625… 475896256…
#> 3     3 123658987 é esse CPF    123658987                 9 00123658… 001236589…
#> 4     4 Cpf é: 25698568          25698568                 8 REVISAR … 000256985…

Created on 2022-03-19 by the reprex package (v2.0.1)

1 curtida

Amei Bea. Eu estava pensando em regex, mas sua ideia ficou bem LEGAL. Muito obrigada :)))

1 curtida

@Fernanda_Kelly
Sempre me deparo com esse problema, então uso muito o comando abaixo para padronizar os CPF’s com 11 dígitos e acrescentado o zero a esquerda.

a <- c("O CPF dele é 47896585",
    "CPF é: 47589625698",
    "123658987 é esse CPF",
    "Cpf é: 25698568")

a %>% parse_number() %>%
  str_trim() %>% 
  str_remove_all(.,"\\.|-" ) %>%
  sprintf("%11s", .)%>%
  str_replace_all(.," ","0") 

3 curtidas

Minha sugestão é usar stringr::str_pad(), que permite preencher strings para que elas fiquem com um tamanho estabelecido.

a <- c(
  "O CPF dele é 47896585",
  "CPF é: 47589625698",
  "123658987 é esse CPF",
  "Cpf é: 25698568"
)

# Preencher na esquerda com 0 até ficar com 11 caracteres
a |>
  stringr::str_extract("[0-9]+") |>
  stringr::str_pad(11, pad = "0")
#> [1] "00047896585" "47589625698" "00123658987" "00025698568"

Created on 2022-03-19 by the reprex package (v2.0.1)

4 curtidas

Caio, fiz da sua forma e não entendi muito bem o pq que usando o pipe o R me deu uma lista em vez de um vetor. Então a cada linha eu tinha uma lista com o resultado do vetor. Já não utilizando o pipe funcionou maravilhosamente be,. Muito obrigada!

Fernanda,

Será que você estava usando str_extract_all() sem querer? Essa função sempre retorna uma lista (diferentemente da str_extract() que só retorna um resultado por string) e notei que você fala sobre ela na sua pergunta.

2 curtidas

Caio,

Quando faço somente com o str_extract() ele pega a sequência de número da primeira linha e replica para todas as outras. Estranho? Muito. Daí não usei o pipe e tudo resolveu.