Recentemente teve um tópico aqui na área sobre Excel que um forista tinha uma dúvida e um outro forista veio com uma solução usando expressões regulares (ou regular expressions ou regex ou regexp). Além disso, o @Asvidzinski comentou sobre a intenção de preparar um programa pra filtrar PDFs e regex podem ser úteis nesse caso também. Isso tudo me lembrou da importância de saber expressões regulares e comecei a bolar alguns tópicos pra ensinar pelo menos o básico sobre o assunto.
Pensei também em como abordar isso, pois pode ser feito de várias formas diferentes inclusive usando Python, porém quem não tá acompanhando os posts de Python mas pretende aprender regex talvez ficasse um pouco tortuoso. Existem ferramentas melhores do que usar Python pra esse tipo de finalidade mas para fazer em formato de tópicos ia dar bem mais trabalho, então caso eu grave uma série de vídeos sobre o assunto talvez eu use essas ferramentas mas nos tópicos vou usar Python mesmo, tentando abstrair o máximo possível a linguagem pra conseguir conversar com todos, tanto com quem sabe programação, sabe Python, como também com quem não sabe programar mas pretende aprender o assunto. Entretanto, as ferramentas que citei acima são sites que conferem expressões regulares em tempo real e ajudam bastante, abaixo vou listar alguns:
Regex Tester - Javascript, PCRE, PHPOnline regex tester and debugger: PHP, PCRE, Python, Golang and JavaScripthttps://pythex.org/Aliás, ano passado o @Sun135 postou um tópico falando sobre o assunto e recomendando um livro bem interessante, talvez o melhor livro de Regex que já foi feito:
Pra quem quer iniciar em programação - #VAILÁEFAZ! - Bastter.comEnfim, depois de muito blablabla, acho que podemos começar.
Expressões regulares são representações de padrões de texto, e usamos tais padrões para filtrar dentro de um texto uma ou mais palavras ou textos desejados.
Imaginem a busca do navegador, quando digitamos ctrl + f para pesquisar alguma palavra numa página web, ou quando estamos lendo um PDF e queremos buscar uma palavra específica. O princípio de expressões regulares é quase isso, entretanto elas tornam nossas buscas muito mais poderosas, pois podemos detectar padrões de texto como números de CPF, números de telefone, nomes próprios de pessoas, etc.
Ou seja, uma regex é uma notação que representa padrões em strings (conjunto de caracteres).
Falei demais, agora já podemos começar a praticar um pouco. Como dito, vou usar Python mas não se preocupem com frases estranhas como "import re", ou "re.compile", ou "pattern.finditer()" caso vocês não programem ainda.
Imaginem que eu tenha uma sequência de strings com todas as letras do alfabeto:
text = 'abcdefghijklmnopqurtuvwxyz'
Mas eu queira filtrar somente as três primeiras letras do alfabeto. Então, meu padrão vai ser algo assim:
# Não se preocupem com essa linha abaixo
import re
text = 'abcdefghijklmnopqurtuvwxyz'
# Nem com essa sintaxe estranha, mas sim com o que tá dentro dos parênteses depois do r
pattern = re.compile(r'abc')
Percebam que eu criei um padrão, 'abc', nas linhas acima.
Agora, eu preciso realmente procurar se existe 'abc' dentro de
'abcdefghijklmnopqurtuvwxyz', ou seja, tal como o Tinder, vou ver se meu padrão deu match com meu texto. Vou adicionar mais linhas de código mas o importante é o que vai aparecer ao final:
matches = pattern.finditer(text)
for match in matches:
print(match)
Abstraindo tudo que foi feito até agora, o importante é nosso resultado:
<_sre.SRE_Match object; span=(0, 3), match='abc'>
Explicando em miúdos agora. Eu criei um código usando Python e rodei. O código deveria procurar 'abc' em 'abcdefghijklmnopqurtuvwxyz'. Ao rodar o código, o Python achou pra mim que na posição 0 até a posição 2 (isso está em "span=(0, 3)", mas o último número é excludente) existe o padrão "abc".
Se ficou confuso o que foi feito com Python, vou mostrar um print usando o site Pythex:

Notem que minha expressão regular era 'abc' e meu texto era
'abcdefghijklmnopqurtuvwxyz', e o match mostrou que o padrão foi encontrado no início do texto.
Vamos agora tentar encontrar 'ABC' em vez de 'abc':

Vejam que em "Match result" nada foi retornado. O que nos diz que regex são "case sensitive", ou seja, diferenciam maiúsculas de minúsculas.
O tópico está grande e eu ainda nem mostrei nenhuma expressão regular de "responsa", mas vou deixar uma palhinha agora ao final. Imaginem que eu queria capturar todos os caracteres do texto. Vou ter que digitar isso?
pattern = re.compile(r'abcdefghijklmnopqurtuvwxyz')
Quem acompanha os tópicos de programação já deve estar pegando o espírito da coisa de que tarefas repetitivas são abomináveis rs e digitar esses caracteres todos ou copiar e colar todos é algo muito estranho. Então eu vou mudar meu padrão pra isso:
pattern = re.compile(r'\w+')
Rodando agora meu código com esse padrão minúsculo:
<_sre.SRE_Match object; span=(0, 26), match='abcdefghijklmnopqurtuvwxyz'>
O Python achou pra mim todo o conjunto de caracteres, da posição 0 a 25, e deu match.
Vamos rodar isso no Pythex:

Todo o texto foi encontrado agora.
Enfim, isso foi só um gostinho de como regex são mágicas. Vamos entrar de cabeça na sintaxe de regex a partir dos próximos tópicos, inclusive explicar como capturei tudo usando um \w+. Espero que essa nova série seja útil pra vocês.