Почему в середине строки, возвращаемой re.split(), есть пустые места?Python

Программы на Python
Anonymous
Почему в середине строки, возвращаемой re.split(), есть пустые места?

Сообщение Anonymous »

Подумайте

Код: Выделить всё

t = re.split(r'([!\s])', "Hello! How are you?")
print(t)
который возвращает:

Код: Выделить всё

['Hello', '!', '', ' ', 'How', ' ', 'are', ' ', 'you?']
почему третий элемент представляет собой пустую строку?
В вопросе «Почему в результатах разделения() возвращаются пустые строки?» в этом ответе говорится, что это позволяет методу join отменить разделение.
Например:

Код: Выделить всё

a = '/segment/segment/'.split('/')
print(a)
# ['', 'segment', 'segment', '']
"/".join(a)
# '/segment/segment/'
"/".join([ch for ch in a if ch])
# 'segment/segment'
Но здесь это не тот случай, потому что здесь мы используем группы захвата для сохранения разделителей:

Код: Выделить всё

t = re.split(r'([!\s])', "Hello! How are you?")
print(t)
# ['Hello', '!', '', ' ', 'How', ' ', 'are', ' ', 'you?']
t1 = "".join(t)
print(t1)
# 'Hello! How are you?'
stripped = [ch for ch in t if ch]
print(stripped)
# ['Hello', '!', ' ', 'How', ' ', 'are', ' ', 'you?']
t2 = "".join(stripped)
print(t2)
# Hello! How are you?
t1==t2
# True
Обратите внимание, что вопрос не в том, как избавиться от пустой строки.
Вопрос в том, почему вообще существует пустая строка.
Этот вопрос также не является дубликатом вопроса «Почему в начале и конце списка, возвращаемого re.split», есть лишние пустые строки? поскольку в этом случае пустые строки фактически необходимы для восстановления исходной строки, поскольку ОП этого вопроса не использовал группы захвата и поэтому разделители не сохранялись, а здесь мы используем группу захвата для сохранения разделителей.

Вернуться в «Python»