Deu match: limpando dados com expressões regulares


Turicas aka Álvaro Justen


Coda.BR 2018

11 de novembro de 2018 - São Paulo/SP

$ whoami

Turicas, prazer! =)

Sigam-me os bons:

{twitter,
github,
youtube,
slideshare,
instagram,
telegram}
/turicas

turicas@brasil.io

Brasil.IO

O Brasil em dados libertos

Logo Brasil.IO
## Regexp: o quê, pra quê? - Sequência que representa um **padrão de caracteres** - Busca - Substituição - Limpeza!

Data Pipeline


schoolofdata.org/methodology

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

Biblioteca rows convertendo PDF para 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})[ -].*`

With great power comes great responsibility.


Obrigado. :)
{twitter,
github,
youtube,
slideshare,
instagram,
telegram}
/turicas

turicas@brasil.io


bit.ly/turicas-regexp