Grupo de captura Python Regex

Resumo : neste tutorial, você aprenderá sobre grupos de captura de regex do Python para criar subgrupos para uma correspondência.

Introdução aos grupos de captura de regex do Python

Suponha que você tenha o seguinte caminho que mostra a notícia com o id 100 em um site:

news/100Linguagem de código:  Python  ( python )

A seguinte expressão regular corresponde ao caminho acima:

\w+/\d+Linguagem de código:  Python  ( python )

Observe que a expressão regular acima também corresponde a qualquer caminho que comece com um ou mais caracteres de palavra, por exemplo, posts, todos, etc., não apenas news.

Neste padrão:

  • \w+é um conjunto de caracteres de palavra com um quantificador (+) que corresponde a um ou mais caracteres de palavra.
  • /calcula o caractere de barra /.
  • \d+é um conjunto de caracteres de dígitos com um quantfifer ( +) que corresponde a um ou mais dígitos.

O programa a seguir usa o padrão \w+/\d+ para corresponder à string ‘ news/100':

import re

s = 'news/100'
pattern = '\w+/\d+'

matches = re.finditer(pattern,s)
for match in matches:
    print(match)Linguagem de código:  Python  ( python )

Saída:

<re.Match object; span=(0, 8), match='news/100'>Linguagem de código:  Python  ( python )

Mostra uma correspondência conforme o esperado.

Para obter o idcaminho, você usa um grupo de captura. Para definir um grupo de captura para um padrão, coloque a regra entre parênteses:

(rule)Linguagem de código:  Python  ( python )

Por exemplo, para criar um grupo de captura que capture o idcaminho, use o seguinte padrão:

'\w+/(\d+)'Linguagem de código:  Python  ( python )

Neste padrão, colocamos a regra \d+entre parênteses (). Se você executar o programa com o novo padrão, verá que ele exibe uma correspondência:

import re

s = 'news/100'
pattern = '\w+/(\d+)'

matches = re.finditer(pattern, s)
for match in matches:
    print(match)Linguagem de código:  Python  ( python )

Saída:

<re.Match object; span=(0, 8), match='news/100'>Linguagem de código:  Python  ( python )

Para obter os grupos de captura de uma partida, você usa o group()método do Matchobjeto:

match.group(index)Linguagem de código:  Python  ( python )

O group(0)retornará a partida inteira enquanto group(1), group(2), etc., retornará o primeiro, segundo,… grupo.

A lastindexpropriedade do Matchobjeto retorna o último índice de todos os subgrupos. O programa a seguir mostra toda a correspondência ( group(0)) e todos os subgrupos:

import re

s = 'news/100'
pattern = '\w+/(\d+)'

matches = re.finditer(pattern, s)
for match in matches:
    for index in range(0, match.lastindex + 1):
        print(match.group(index))Linguagem de código:  Python  ( python )

Saída:

news/100
100Linguagem de código:  Python  ( python )

Na saída, news/100é a correspondência inteira enquanto 100é o subgrupo.

Se você quiser capturar também o recurso ( news) no caminho ( news/100), você pode criar um grupo de captura adicional como este:

'(\w+)/(\d+)'Linguagem de código:  Python  ( python )

Neste padrão, temos dois grupos de captura, um para \w+e outro para \d+. O programa a seguir mostra toda a partida e todos os subgrupos:

import re

s = 'news/100'
pattern = '(\w+)/(\d+)'

matches = re.finditer(pattern, s)
for match in matches:
    for index in range(0, match.lastindex + 1):
        print(match.group(index))Linguagem de código:  Python  ( python )

Saída:

news/100
news
100Linguagem de código:  Python  ( python )

Na saída, the news/100é a correspondência inteira enquanto newse 100são os subgrupos.

Grupos de captura nomeados

Por padrão, você pode acessar um subgrupo em uma correspondência usando um índice, por exemplo, match.group(1). Às vezes, acessar um subgrupo por um nome significativo é mais conveniente.

Você usa o grupo de captura nomeado para atribuir um nome a um grupo. Veja a seguir a sintaxe para atribuir um nome a um grupo de captura:

(?P<name>rule)Linguagem de código:  Python  ( python )

Nesta sintaxe:

  • ()indica um grupo de captura.
  • ?P<name>especifica o nome do grupo de captura.
  • ruleé uma regra no padrão.

Por exemplo, o seguinte cria os nomes:

'(?P<resource>\w+)/(?P<id>\d+)'Linguagem de código:  Python  ( python )

Nesta sintaxe, the resourceé o nome do primeiro grupo de captura e the idé o nome do segundo grupo de captura.

Para obter todos os subgrupos nomeados de uma correspondência, você usa o groupdict()método do Matchobjeto. Por exemplo:

import re

s = 'news/100'
pattern = '(?P<resource>\w+)/(?P<id>\d+)'

matches = re.finditer(pattern, s)
for match in matches:
    print(match.groupdict())Linguagem de código:  Python  ( python )

Saída:

{'resource': 'news', 'id': '100'}Linguagem de código:  Python  ( python )

Neste exemplo, o groupdict()método retorna um dicionário onde as chaves são nomes de grupos e os valores são os subgrupos.

Mais exemplo de grupo de captura nomeado

O seguinte padrão:

\w+/d{4}/d{2}/d{2}Linguagem de código:  Python  ( python )

corresponde a este caminho:

news/2021/12/31Linguagem de código:  Python  ( python )

E você pode adicionar os grupos de captura nomeados ao padrão assim:

'(?P<resource>\w+)/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})'Linguagem de código:  Python  ( python )

Este programa usa os padrões para corresponder ao caminho e mostra todos os subgrupos:

import re

s = 'news/2021/12/31'
pattern = '(?P<resource>\w+)/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})'

matches = re.finditer(pattern, s)
for match in matches:
    print(match.groupdict())Linguagem de código:  Python  ( python )

Saída:

{'resource': 'news', 'year': '2021', 'month': '12', 'day': '31'}Linguagem de código:  Python  ( python )

Resumo

  • Coloque uma regra de padrão entre parênteses () para criar um grupo de captura.
  • Use o group()método do Matchobjeto para obter o subgrupo por um índice.
  • Use (?P<name>rule)para criar um grupo de captura nomeado para a regra em um padrão.
  • Use o groupdict()método do Matchobjeto para obter os subgrupos nomeados como um dicionário.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *