Поскольку именно это задокументировано для выполнения в первых двух строчках документации (выделение добавлено):
Разделение string
по вхождениям pattern
. Если в pattern
используются захватывающие скобки, то текст всех групп в шаблоне также возвращается как часть полученного списка.
«почему» дляСама особенность заключается в том, что иногда вы хотите, чтобы знали, что вы захватили, особенно при использовании более сложного шаблона, который может соответствовать всем видам вещей, и вам может потребоваться настроить код в зависимости от последовательности разбиения.
В самом простом примере, если вы хотите изменить определенные слова в предложении (достаточно сложным образом, чтобы re.sub
не был разумным вариантом), затем восстановите предложение точно таким, каким оно было,но с новыми словами, разделенными на неалфавитные символы или пробелами без пробелов, невозможно было бы восстановить форму исходного предложения;даже без изменения слов, используя простой str.split
для пробелов и просто предполагая, что это одиночные пробелы, ' '.join('a\tb\nc d\re'.split())
вернет 'a b c d e'
;в тот момент, когда вы разделитесь без захвата, вы потеряете данные.В отличие от этого, ''.join(re.split(r'(\s+)', 'a\tb\nc d\re'))
не имеет потерь.
Если вам нужно сгруппировать без захвата, используйте не захватывающие группы вида (?:PAT)
вместо захвата, (PAT)
.