RegEx XXI: grupos não capturantes

Published by Alessandro Manicone in

Um grupo não capturante corresponderá a "x" em (?:x), mas a correspondência não será armazenada, o que significa que você não poderá acessá-la usando uma retroreferência, e ela não será exibida separadamente ao usar re.findall().

Vamos ver um exemplo da diferença entre grupos capturantes e não capturantes:

txt = "red car, blue car, yellow car, green car, red car, red bike, blue bike"

pattern1 = "(red|blue) car"
pattern2 = "(?:red|blue) car"
pattern3 = "red|blue car"
pattern4 = "((red|blue) (car|bike))"
pattern5 = "((red|blue) (?:car|bike))"


re.findall(pattern1, txt) ➞ ["red", "blue", "red"]
re.findall(pattern2, txt) ➞ ["red car", "blue car", "red car"]
re.findall(pattern3, txt) ➞ ["red", "blue car", "red", "red"]
re.findall(pattern4, txt) ➞ [("red car", "red", "car"), ("blue car", "blue", "car"), ("red car", "red", "car"), ("red bike", "red", "bike"), ("blue bike", "blue", "bike")]
re.findall(pattern5, txt) ➞ [("red car", "red"), ("blue car", "blue"), ("red car", "red"), ("red bike", "red"), ("blue bike", "blue")]
  • A primeira expressão corresponde a "red" ou "blue", desde que sejam seguidos por " car".
  • A segunda expressão corresponde a "red car" ou "blue car".
  • A terceira expressão corresponde a "red" ou "blue car".
  • Na quarta expressão, corresponde a uma das seguintes possibilidades: "red car", "red bike", "blue car", "blue bike". Ela retornará uma tupla para cada correspondência contendo um elemento para cada grupo capturante, neste caso: a expressão inteira, a cor e o tipo de veículo.
  • A quinta expressão é semelhante à quarta, exceto que o tipo de veículo é um grupo não capturante. Como você pode ver, ele não é retornado separadamente.

Escreva uma expressão regular para corresponder a qualquer par de artigo + substantivo. Os artigos são "a/an" ou "the". Use grupos não capturantes na sua expressão.

Exemplo

txt = "There is an apple and a pen on the desk"
pattern = "yourregularexpressionhere"

re.findall(pattern, txt) ➞ ["an apple", "a pen", "the desk"]

Observações

  • Você não precisa escrever uma função, apenas o padrão.
  • Não remova import re do código.
  • Encontre mais informações sobre RegEx e grupos não capturantes em Recursos.
  • Você pode encontrar todos os desafios desta série na minha coleção Basic RegEx.