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
- Data e Horário
- Número IP,Sites
- Endereço de e-mail
- URL
- Número de telefone, CPF, cartão de crédito
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
<- colors()
cores 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
<- " caracteres em branco, no incio e final "
teste 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.
<- c(
sintomas "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
- no capítulo sobre strings do livro R for Data Science
- Documentação do stringr: https://stringr.tidyverse.org/
- Vignette do Stringr
- Regex101: https://regex101.com/ (Ferramenta online para testar e depurar expressões regulares)
- Regular-Expressions.info: https://www.regular-expressions.info/ (Tutorial sobre expressões regulares)