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/100
Linguagem 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 id
caminho, 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 id
caminho, 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 Match
objeto:
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 lastindex
propriedade do Match
objeto 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
100
Linguagem 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
100
Linguagem de código: Python ( python )
Na saída, the news/100
é a correspondência inteira enquanto news
e 100
sã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 Match
objeto. 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/31
Linguagem 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 doMatch
objeto 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 doMatch
objeto para obter os subgrupos nomeados como um dicionário.