Возможный дубликат:
Не захватывающая группа?
Из документа модуля python re я вижу:
(?:...) Non-grouping version of regular parentheses.
а также
(...) Matches the RE inside the parentheses.
The contents can be retrieved or matched later in the string.
В чем разница?
коротко: негруппирование означает, что оно не будет сопоставлено с группой. то есть вы не можете ссылаться на него, например, на \1.
Разница в том, что сказал Кент.
Это может быть полезно для очень сложных регулярных выражений или при применении к большим объемам текста, где производительность имеет решающее значение.
Кроме того, если вы используете много группировки в своем регулярном выражении, но только некоторые из них должны быть указаны после (для замены текста или по любой причине), то проще иметь только те, которые вам действительно нужны для захвата групп, поэтому вы можете ссылайтесь затем от \1 (или $ 1, зависит),\n, вместо пропусков чисел.
Негруппирование позволяет вам использовать последовательность символов в строке соответствия, не возвращая ее в качестве одного из ваших действительных совпадений. Например, скажем, вы искали квитанцию, и вы только хотели вытащить цены на предметы. Скажите, что ваше квитанция выглядит так:
milk 1.25
bread 1.15
deli meat 5.25
total 7.65
Вы можете использовать негруппированный парик, чтобы исключить строку с ценой, которая указана в общей сумме, но запомните все другие цены.
.groups()
, поэтому, если вы выполняете findall()
или что-то в этом роде, оно будет эффективно вести себя так, как я описываю.
(?:...)
прежнему «группирует» внутреннее выражение некоторым образом (подумайте о(?:...)+
, квантификатор применяется к группе while), но вы не можете ссылаться на сопоставляемое содержимое позже, потому что это не захвачено.