Anexo 3 - Expressões Regulares

Uma Expressão Regular, conhecidas por REGEX, é um método formal de se especificar um padrão de texto.

É uma composição de símbolos, caracteres com funções especiais, chamados “metacaracteres” que, agrupados formam uma sequencia, ou expressão regular

Uma expressão regular é testada em textos e retorna sucesso caso este texto obedeça exatamente a todas as suas condições. Neste caso dizemos que o texto “casa” com (match) a expressão regular.

As REGEXs servem para se dizer algo abrangente de forma mais rigorosa. Definido o padrão, tem-se uma lista (finita ou não) de possibilidades de casamento.

Exemplo: [rgp]ato pode casar com “rato”, “gato” e “pato” Mas não “mato”

Utilidade das Expressões Regulares e a busca de padrões em textos

Vários Linguagens de Programação, editores de texto têm suporte às REGEXs.

Para exemplificar o uso das REGEX em R , usaremos as funções do modulo base grep, gsub

regexp no modulo base

cores <- colors()
grep("blue",cores)

Retorna o índice de todos os elementos do vetor cores que possuem “blue”

Alguns Metacaracteres

  • Circunflexo ^ - Simboliza o início de uma linha
grep("^blue",cores) 
​ ​\
Retorna o índice de todos os elementos do vetor cores começados por "blue"
  • Cifrão $ - Simboliza o fim de uma linha
grep("yellow$",cores,value=T)

Retorna o índice de todos os elementos do vetor cores terminados por “yellow”

  • Listas [] - Simboliza conjunto de caracteres numa determinada posição.
grep("^[aeiou]",cores,value=T)

cores começadas por vogais

grep("[0-9]$",cores,value=T)

cores terminadas por numeros

  • Ponto . - Simboliza “qualquer” caracteres numa determinada posição
grep("grey..",cores,value=T)

cor cinza seguida por dois caracteres qualquer

grep("^....$",cores,value=T)

cores com apenas 4 caracteres

  • Chaves {} - Simboliza a quantidade de repetições do caractere anterior
grep("e{2}",cores,value=T)
padrão onde cores tem dois "e" seguidos
grep("[0-9]{3,5}",cores ,value=T)

onde cores tem de 3 a 5 numeros

  • Curinga * - Simboliza “qualquer coisa”, inclusive nada.
grep("^[s].*[0-9]$",cores,value=T)
cores começadas por "s" e terminadas por numero!
  • Operador logico OU (OR) ‘|’

Para fazer um OU lógico, onde buscamos uma coisa OU outra, deve-se usar o | e delimitar as opções entre parênteses: ​

grep("^[w]|^[y]",cores,value=T)

Não deve conter espaços! Nesse exemplo é o mesmo que

    "^[wy]"
  • Operador logico NÃO (NOT) [^]

Pesquisa para retornar as cores que não começam por vogais

grep("^[bcdfghjklmnpqrstvwxyz]",cores)

Ou usar negativa (NOT) usando “^”

grep("^[^aeiou]", cores,value=T)

repare que o não é o ^ que está dentro das chaves!

  • Intervalo de Lista [-] - Busca por faixa de caracteres ou números
grep("\[0-9\]{3,}", cores,value=T)

Busca por números de três dígitos ou mais

grep("[r-z]$",cores,value=T) 

Busca por cores terminadas com letras entre r e z ​
A função gsub faz substituições em strings usando REGEX ​

teste <- "   caracteres em branco, no incio e final  "
gsub("^\\s+|\\s+$", "", teste)

O Pacote stringr

O pacote stringr é parte do “tidyverse” e foi projetado para simplificar a manipulação de strings em R. Ele oferece funções que são mais consistentes com a filosofia do tidyverse, como:

  • Sintaxe clara e intuitiva: Funções com nomes descritivos e argumentos bem definidos.
  • Tratamento consistente de NA: stringr lida com valores NA de forma previsível.
  • Integração com o tidyverse: Funciona bem com outros pacotes do tidyverse, como dplyr e ggplot2.

Vamos revisar alguns dos caracteres e metacaracteres mais comuns em expressões regulares:

  • . (ponto): Corresponde a qualquer caractere, exceto quebra de linha.
    • (asterisco): Corresponde a zero ou mais ocorrências do caractere/grupo anterior.
    • (mais): Corresponde a uma ou mais ocorrências do caractere/grupo anterior.
  • ? (interrogação): Corresponde a zero ou uma ocorrência do caractere/grupo anterior (opcional).
  • [^ ] (colchetes com acento): Define uma classe de caracteres negada. Ex: [0-9] corresponde a qualquer caractere que não seja um dígito.
  • ^ (circunflexo): Corresponde ao início da string.
  • $ (cifrão): Corresponde ao final da string.
  • Corresponde a um dígito (0-9).
  • : Corresponde a um caractere alfanumérico (a-z, A-Z, 0-9, _).
  • : Corresponde a um espaço em branco (espaço, tabulação, quebra de linha).
  • () (parênteses): Agrupa partes da expressão regular.

Funções stringr para Expressões Regulares

O pacote stringr oferece diversas funções para trabalhar com expressões regulares. As mais utilizadas são:

  • str_detect(string, pattern): Retorna um vetor lógico indicando se cada string no vetor string corresponde ao padrão pattern.
  • str_match(string, pattern): Retorna uma matriz com as correspondências encontradas no padrão. A primeira coluna contém as correspondências completas, e as colunas subsequentes correspondem aos grupos de captura (definidos por parênteses na regex).
  • str_match_all(string, pattern): Semelhante a str_match, mas retorna um objeto “list” que pode conter mais informações sobre as correspondências.
  • str_replace(string, pattern, replacement): Substitui a primeira ocorrência do padrão pattern por replacement em cada string.
  • str_replace_all(string, pattern, replacement): Substitui todas as ocorrências do padrão pattern por replacement em cada string.
  • str_extract(string, pattern): Extrai a primeira ocorrência do padrão pattern de cada string.
  • str_extract_all(string, pattern): Extrai todas as ocorrências do padrão pattern de cada string.
sintomas <- c(
  "Febre alta, tosse seca, dor de garganta, fadiga",
  "Dor de cabeça, congestão nasal, espirros, coriza",
  "Dor abdominal, náuseas, vômitos, diarreia",
  "Erupção cutânea, coceira, febre baixa, fadiga",
  "Dores musculares, febre,falta de ar, tosse produtiva",
  "Dor de cabeça, visão turva, rigidez no pescoço, febre",
  "Falta de apetite, perda de peso, cansaço, dor abdominal",
  "Tosse crônica, falta de ar, chiado no peito, fadiga",
  "Dor nas articulações, inchaço, febre baixa, cansaço",
  "Dor de cabeça, tontura, zumbido no ouvido"
)

Usando as funções do stringr

# quantos falam em febre
table(str_detect(sintomas,'[Ff]ebre'))

#quantos relatam fadiga ou cansaço
table(str_detect(sintomas,'[Ff]adiga|cansaço'))


# Dor E Febre
table((str_detect(sintomas  ,'[Dd]or') & str_detect(sintomas  ,'[Ff]ebre')))

# Dor OU Febre
table((str_detect(sintomas  ,'[Dd]or') | str_detect(sintomas  ,'[Ff]ebre')))

# qual e a palavra que vem depois de febre
str_match(sintomas,'[Ff]ebre\\s([a-zA-Z]{1,})')

# mudar falta de ar para falta_de_ar
str_replace_all(sintomas,'falta.*ar','falta_de_ar')

Como vimos existem vários pacotes com funções que permitem usar REGEX, lembre-se que o R utiliza dialeto de REGEX aprenda um pouco mais os recursos no R