Enviar um café pro programador

Mostrando postagens com marcador Tutorial de Regex. Mostrar todas as postagens
Mostrando postagens com marcador Tutorial de Regex. Mostrar todas as postagens

Substituindo strings: Método sub() (Tutorial de Regex Parte 8)

Vamos aprender neste tutorial de Regex em Python, como fazer substituições em strings que estamos trabalhando, em expressões regulares, através do método sub()


Fazer Substituição em Regex: Método sub()


Até o momento, em nossos tutoriais de regex, aprendemos a detectar determinados padrões em textos, usando expressão regular.

Porém, é comum que, ao invés de apenas detectar, queiramos substituir uma coisa por outra.
Por exemplo, se seu amigo diz:
- Funk é o melhor estilo musical

Seria legal ser substituído por:
- Rock é o melhor estilo musical

Isso pode ser feito através do método sub(), presentes em objetos Regex.
Esse método recebe dois argumentos:
A string, o texto ou valor que vamos querer colocar no lugar de outra
A string onde irá ocorrer a substituição

Ou seja: minhaRegex.sub( substituirPorIsso, antigaString)

O script abaixo substituir o padrão 'Funk' por 'Heavy Metal':
import re

while True:
	texto = input("Digite sua string: " )

	minhaRegex = re.compile(r'Funk')
	minhaRegex = minhaRegex.sub('Heavy Metal', texto)
	
	print(minhaRegex)

Veja o resultado:
Tutorial de Regex em Python

Texto correspondente na substituição: \1, \2, \3...

Muitas vezes, é comum que queiramos usar o texto correspondente (que vai ser encontrado pelo padrão), pra usar na própria substituição.

Por exemplo, o primeiro grupo da Regex, será simbolizado por \1.
O segundo grupo, por \2 .
E assim por diante.

Por exemplo, a string de regex: r'padrao1(padrao2)padrao3(padrao4)'
O padrao2 pode ser simbolizado por \1
O padrao4 pode ser simbolizado por \2

O script abaixo detecta se foi digitado Funk.
Se sim, essa correspondência vai ser armazenada em \1

Então, substituímos ela por '\1 (eca)'
Ou seja, onde tiver 'Funk', vai aparecer 'Funk (eca)':



import re

while True:
	texto = input("Digite sua string: " )

	minhaRegex = re.compile(r'(Funk)')
	minhaRegex = minhaRegex.sub('\1 (eca)', texto)
	
	print(minhaRegex


Tutorial Expressões Regulares em Python, parte 2: Grupos e parêntesis ()

Neste segundo tutorial sobre expressões regulares, vamos ver o uso dos parêntesis nas regex e como usar os grupos.

Baixe a apostila Python Progressivo
Certificado do curso (para trabalhar como programador profissional)

Grupos em Regex: ( )


No tutorial anterior, de Regex parte 1, já vimos o que é uma regex, para que serve, onde são usadas e trabalhamos com um exemplo: os dos telefones do tipo xxxx-yyyy , onde usamos a regex \d para representar qualquer dígito.

Agora vamos um pouquinho mais além, e trabalhar com números que usam também o DDD.
Esses números de telefone, tem o seguinte padrão:
xx yyyy-zzzz

Uma regex que capta esse padrão, seria:
  • '\d\d \d\d\d\d-\d\d\d\d'


Mais concisamente:
  • '\d{2} \d{4}-\d{4}'

Note que tem 4 coisas aí: o DDD, o primeiro bloco de dígitos (que geralmente você descobre a operadora por ele) e o último bloco.

Vamos organizar esses blocos em grupos. Para isso, colocamos eles entre parêntesis:
  • '(\d{2}) (\d{4})-(\d{4})'

Como Usar os Grupos em Regex: group()

Tenha uma coisa em mente: os parêntesis não vão alterar sua regex. Ou seja, não precisa ter parêntesis ao redor dos números em sua string, pra dar match.

Então para que serve? É simples: podemos acessar diretamente cada grupo depois, pelo método group.

Ao dar match, o primeiro grupo poderá ser acessado pelo método: group(1)
O segundo grupo é acessado por: group(2)
E o terceiro por: group(3)

O código abaixo detecta um número de telefone no formato: xx yyyy-zzzz e mostra, separadamente, o DDD desse número:

import re
while True:
 texto = input("Digite sua string: " )
 
 minhaRegex = re.compile(r'(\d{2}) (\d{4})-(\d{4})')
 resultado = minhaRegex.search(texto)
 
 print("Numero detectado:", resultado.group())
 print("DDD desse numero:", resultado.group(1))


O método group sem argumento algum, já havíamos utilizado: ele mostra tudo, toda a regex que bateu. Usamos ele pra exibir o número inteiro do telefone, em seguida usamos o primeiro grupo, via group(1), para exibir somente o DDD.


Prontinho, além de termos extraído o número de telefone, fomos mais além e ainda detectamos que trecho é o de DDD, agora você pode extrair milhões de números de um arquivo de texto, site, documento etc, e ainda categorizar, dizer quantos são de cada cidade, tratando o DDD.

Se desejar uma tupla, ou seja, uma lista com todos os grupos que foram detectados, use o método groups() (sem argumento nenhum), que você vai ter a tupla separada bonitinha, separando os grupos de maneira organizada.