Как разделить предложение в python, сохраняя разделители?
У меня есть вариант кода:
text = 'здравствуйте убрать из счета позицию 1 добавить 2 убрать 3. добавить 4 жду исправленный счет'
patterns = r'(убрать)|(удалить)|(добавить)|(прибавить)|(изменить)'
re.split(patterns, text)
Результат:
['здравствуйте ',
'убрать',
None,
None,
None,
None,
' из счета позицию 1 ',
None,
None,
'добавить',
None,
None,
' 2 ',
'убрать',
None,
None,
None,
None,
'3. ',
None,
None,
'добавить',
None,
None,
'4 жду исправленный счет']
Мне нужен вывод без "None" и чтобы было так:
['здравствуйте ',
'убрать из счета позицию 1 ',
'добавить 2 ',
'убрать 3. ',
'добавить 4 жду исправленный счет']
Либо если у меня текст такой:
text = 'здравствуйте из счета позицию 1 убрать 2 добавить 3. убрать 4 добавить жду исправленный счет'
То разделить вот так:
['здравствуйте из счета позицию 1 убрать ',
'2 добавить ',
'3. убрать ',
'4 добавить',
'жду исправленный счет']
Можно просто записать, как будет для первого и второго случая отдельно, не связывая оба случая.
Ответы (1 шт):
Автор решения: Wiktor Stribiżew
→ Ссылка
Используйте
import re
text = 'здравствуйте убрать из счета позицию 1 добавить 2 убрать 3. добавить 4 жду исправленный счет'
patterns = r'(?:^|\s+)(?=убрать|удалить|добавить|прибавить|изменить)'
print( re.split(patterns, text) )
См. пример работы кода. Результат:
['здравствуйте', 'убрать из счета позицию 1', 'добавить 2', 'убрать 3.', 'добавить 4 жду исправленный счет']
Подробности
(?:^|\s+)- незахватывающая подмаска, начало строки или один и более пробельных символов(?=убрать|удалить|добавить|прибавить|изменить)- блок предварительного просмотра вперёд, сразу справа должна присутствовать одна из подстрокубрать,удалить,добавить,прибавитьилиизменить.
Чтобы находить целые слова, добавьте границу слова \b в конце, (?:^|\s+)(?=(?:убрать|удалить|добавить|прибавить|изменить)\b).
Для строк вторго типа можно использовать
.*?(?:\d\W*(?:убрать|удалить|добавить|прибавить|изменить)|\Z)
См. пример работы выражения. Подробности:
.*?- ноль и более любых символов, как можно меньше(?:- начало незахватывающей подмаски:\d\W*(?:убрать|удалить|добавить|прибавить|изменить)- цифра, ноль и более специальных (кроме_, для включения этого символа используйте[\W_]) или пробельных символов, а потом одна из подстрокубрать,удалить,добавить,прибавитьилиизменить|- или\Z- конец строки
)- конец незахватывающей подмаски
См. пример работы кода:
import re
text = 'здравствуйте из счета позицию 1 убрать 2 добавить 3. убрать 4 добавить жду исправленный счет'
pattern = r'.*?(?:\d\W*(?:убрать|удалить|добавить|прибавить|изменить)|\Z)'
matches = re.findall(pattern, text, re.S)
print( [x.lstrip() for x in matches if x.strip() ] )
# => [
'здравствуйте из счета позицию 1 убрать',
'2 добавить',
'3. убрать',
'4 добавить',
'жду исправленный счет'
]