-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path03-regex.Rmd
98 lines (73 loc) · 4.51 KB
/
03-regex.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
---
title: "Regex"
author: "Daniel Falbel, William Amorim"
---
```{r, message=FALSE, warning=FALSE, include=FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
out.width = "60%", out.height = "60%",
fig.retina = 2
)
```
```{r, echo = FALSE, message = FALSE, warning = FALSE}
library(stringr)
```
## Expressões Regulares
Trabalhar com textos exige um certo conhecimento de [expressões regulares](https://pt.wikipedia.org/wiki/Express%C3%A3o_regular). As expressões regulares --- ou simplesmente **regex** --- permitem identificar conjuntos de caracteres, palavras e outros padrões por meio de uma sintaxe concisa.
O `stringr` utiliza regex da forma descrita [neste documento](http://www.gagolewski.com/software/stringi/manual/?manpage=stringi-search-regex). A própria [definição](https://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html) de regex do R é um ótimo manual.
Vamos estudar expressões regulares por meio de exemplos e da função `str_detect()`. Ela retorna `TRUE` se uma *string* atende a uma expressão regular e `FALSE` caso contrário. Por exemplo:
```{r}
str_detect("sao paulo", pattern = "paulo$")
str_detect("sao paulo sp", pattern = "paulo$")
```
A regex/pattern "paulo\$" indica que o texto deve ser terminado em "paulo". Existem diversos caracteres auxiliares que vão auxiliar na manipulação dos textos, assim como o "\$". Importante: o valor passado para o argumento `pattern` de qualquer função do pacote `stringr` será entendido como uma regex.
A tabela abaixo mostra a aplicação de cinco regex em seis *strings* distintas.
- '^ban' reconhece apenas o que começa exatamente com "ban".
- 'b ?an' reconhece tudo que tenha "ban", com ou sem espaço entre o "b" e o "a".
- 'ban' reconhece tudo que tenha "ban", mas não ignora case.
- BAN' reconhece tudo que tenha "BAN", mas não ignora case.
- 'ban$' reconhece apenas o que termina exatamente em "ban"
```{r, message=FALSE, warning=FALSE, include=FALSE}
s <- c('ban', 'banana', 'abandonado', 'pranab anderson', 'BANANA',
'ele levou ban')
expressoes <- list(
'ban', # reconhece tudo que tenha "ban", mas não ignora case
'BAN', # reconhece tudo que tenha "BAN", mas não ignora case
'ban$', # reconhece apenas o que termina exatamente em "ban"
'^ban', # reconhece apenas o que começa exatamente com "ban"
'b ?an' # reconhece tudo que tenha "ban", com ou sem espaço entre o "b" e o "a"
)
```
```{r, echo=FALSE, message=FALSE, warning=FALSE}
library(purrr)
library(dplyr)
library(tidyr)
list(strings = s, expressoes = expressoes) %>%
cross_d() %>%
distinct() %>%
mutate(detect = str_detect(s, expressoes)) %>%
spread(expressoes, detect) %>%
knitr::kable()
```
### Quantificadores
Os caracteres `+`, `*` e `{x,y}` indicam quantas vezes um padrão se repete:
- `ey+` significa `e` e depois `y` "**uma vez** ou mais". Por exemplo, reconhece `hey`, `heyy`, `a eyyy`, mas não reconhece `e`, `y` nem `yy`.
- `ey*` significa "**nenhuma vez** ou mais". Por exemplo, reconhece `hey`, `heyy`, `a eyyy` e `e`, mas não reconhece `y` nem `yy`.
- `ey{3}` significa "exatamente três vezes". Por exemplo, reconhece `eyyy` e `eyyyy`, mas não reconhece `eyy`.
- `ey{1,3}` significa "entre uma e três vezes".
Para aplicar um quantificador a um conjunto de caracteres, use parênteses. Por exemplo, `(ey )+` reconhece `ey ey `.
### Conjuntos
Colocando caracteres dentro de `[]`, reconhecemos quaisquer caracteres desse conjunto. Alguns exemplos práticos:
- `[Cc]asa` para reconhecer "casa" em maiúsculo ou minúsculo.
- `[0-9]` para reconhecer somente números. O mesmo vale para letras `[a-z]`, `[A-Z]`, `[a-zA-Z]` etc.
- O símbolo `^` dentro do colchete significa negação. Por exemplo, `[^0-9]` significa pegar tudo o que não é número.
- O símbolo `.` fora do colchete indica "qualquer caractere", mas dentro do colchete é apenas ponto.
- Use `[[:space:]]+` para reconhecer espaços e `[[:punct:]]+` para reconhecer pontuações.
### Miscelânea
- Use `abjutils::rm_accent()` para retirar os acentos de um texto.
- Use `|` para opções. Por exemplo, `desfavor|desprov` reconhece tanto "desfavorável" quanto "desprovido"
- O código `\n` pula linha, `\f` é final da página, `\t` é tab. Use `\` para transformar caracteres especiais em literais.
- Use as funções `tolower()` e `toupper()` para mudar o case de uma *string*.
A lista de possibilidades com expressões regulares é extensa.
Um bom lugar para testar o funcionamento das regex é o [regex101](https://regex101.com/).
--------------------------------------------------------------------------------