Как сохранить разделители на месте при разбиении строки с несколькими разделителями? - PullRequest
1 голос
/ 13 апреля 2020
import re

p = re.compile(r"([?.;])")

ss = re.split(p, 'This is a test? This is a test?good.bad')

for s in ss:
    print(s)

Результат:

This is a test
?
 This is a test
?
good
.
bad

Я надеюсь, что результат будет:

This is a test?
This is a test?
good.
bad

Почему он помещает разделитель в другую строку?

РЕДАКТИРОВАТЬ: Я думаю, я понимаю, почему он это сделал. Вопрос в том, как получить желаемый результат.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

В комментарии сказано, что вы должны использовать шаблон p. Вот способ объединить пары после разделения. zip_longest обеспечивает работу нечетного спаривания, возвращая None для второго элемента, который при наличии конвертируется в пустую строку.

import re
from itertools import zip_longest

p = re.compile(r"([?.;])")

ss = re.split(p, 'This is a test? This is a test?good.bad')

for a,b in zip_longest(ss[::2],ss[1::2]):
    print(a+(b if b else ''))

Вывод:

This is a test?
 This is a test?
good.
bad
2 голосов
/ 13 апреля 2020

Вы можете объединить разделители и предшествующие элементы:

 ss = re.split(p, 'This is a test? This is a test?good.bad')
 result = [ a+b for a, b in zip(ss[::2], ss[1::2]) ] + (ss[-1:] if len(ss) % 2 else [])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...