Deu match: limpando dados com expressões regulares
Turicas aka Álvaro Justen
11 de novembro de 2018 - São Paulo/SP
$ whoami
Turicas, prazer! =)
Sigam-me os bons:
O Brasil em dados libertos
## Regexp: o quê, pra quê?
- Sequência que representa um **padrão de caracteres**
- Busca
- Substituição
- Limpeza!
Maior parte do tempo dos projetos de análise de dados:
## Regexp: onde usar?
- Editores de texto (e código)
- SQL
- Linguagens de programação
- Programas para limpeza de dados (exemplo: OpenRefine)
- ...
## Regexp: onde NÃO usar?
- Parsers de linguagens como HTML
- Casos complexos demais para entender e manter a expressão
## Material
- [regexr.com](https://regexr.com/): site para testar
- [bit.ly/turicas-regexp](bit.ly/turicas-regexp): esses slides
## Representando padrões simples
- `a`: letra `a` (aparecendo uma vez)
- `2`: número `2` (aparecendo uma vez)
- `.`: qualquer caractere (aparecendo uma vez)
- `\.`: ponto (`.`)
- `[abc]`: `a`, `b` ou `c` (aparecendo uma vez)
## Exercício: Extrair data
- `11/11/2018`
- `11/11/18`
- `1/1/18`
- `01/1/18`
- `1/01/18`
## Representando padrões mais complexos
- `[0-9]`: número de `0` a `9` (aparecendo uma vez)
- `[a-z]`: letra do alfabeto (minúscula)
- `[A-Z]`: letra do alfabeto (maiúscula)
- `\[` e `\]`: `[` e `]`
- `[^x]`: não `x`
- `^exp`: `exp` logo no começo da linha
- `exp$`: `exp` logo no fim da linha
- Melhorar extrator de data
## Atalhos
- `\d` ou `\D`: dígito/não dígito
- `\w` ou `\W`: palavra/não palavra
- `\s` ou `\S`: espaço (vários caracteres)/não espaço
- Melhorar extrator de data
## Representando quantidades
- `?`: zero ou uma vez
- `+`: pelo menos uma vez
- `*`: qualquer quantidade (inclusive zero)
- `{x}`: exatamente x vezes
- `{x,y}`: entre x e y vezes (ambos inclusos)
- Melhorar extrator de data
## Exercício: data com mês por extenso
- `11 de novembro de 2018`
- `25 de agosto de 1999`
- `31 de janeiro de 1980`
## Representando agrupamentos
- `(exp)`: cria um grupo
- `(exp1|exp2)`: ocorrência de `exp1` ou `exp2`
- `\x` (ou `$x`): referencia o grupo de número `x` (começa de 1)
- Usado em substituições
- Substituir extrator de data
## Exercício: Extrair CPF
- `111.111.111-11`
- `111 111 111-11`
- `111.111.111/11`
- `11111111111`
Exemplo real: Balneabilidade da costa baiana
rows convert arquivo.pdf arquivo.csv
## Exercício: Extrair código da costa
- `"2ª. Praia de Morro de São Paulo - CDD- SP 200"`: capturar `"CDD"`
- `"2ª. Praia de Morro de São Paulo - CDD - SP 200"`: capturar `"CDD"`
- `"Costa - Canavieiras - CCA CN 100"`: capturar `"CCA"`
- `"Madre de Deus - BTS MD 100"`: capturar `"BTS"`
- `"Madre de Deus -BTS MD 100"`: capturar `"BTS"`
- `"Nativos - CDES NT 100"`: capturar `"CDES"`
- `"NATIVOS - CDES NT 100"`: capturar `"CDES"`
## Exemplo em código
- [github.com/Correio24horas/balneabilidade-bahia](https://github.com/Correio24horas/balneabilidade-bahia)
- Resultado: `.*[- ]([A-Z]{3,4})[ -].*`