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")]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.
txt = "There is an apple and a pen on the desk"
pattern = "yourregularexpressionhere"
re.findall(pattern, txt) ➞ ["an apple", "a pen", "the desk"]import re do código.