Регулярное выражение: текст после шаблона
Задача: Есть тест, его нужно разбить по группам.
Пример: "(1) Для начала Вам нужно создать задачу. (2) После создания задачи Вам нужно написать письмо. (3) Тест письма: ..."
Вопрос: Как мне получить что-то такое:
(1) Для начала Вам нужно создать задачу. \n
(2) После создания задачи Вам нужно написать письмо. \n
(3) Тест письма: ... \n
Это всё, что пока у меня получилось:
value = "(1) Для начала Вам нужно создать задачу. (2) После создания задачи Вам нужно написать письмо. (3) Тест письма: ..."
reg = re.findall('\(\d\)', value)
>>>['(1)', '(2)', '(3)']
Ответы (4 шт):
Попробуйте так :
import re
text = "(1) Для начала Вам нужно создать задачу. (2) После создания задачи Вам
нужно написать письмо. (3) Тест письма: ..."
split_regex = re.compile(r'[.|!|?|…]')
sentences = filter(lambda t: t, [t.strip() for t in split_regex.split(text)])
for s in sentences:
print(s)
Можно без регулярных выражений (если нет жесткого ограничения условия задачи):
text = '(1) Для начала Вам нужно создать задачу. (2) После создания задачи Вам нужно написать письмо. (3) Тест письма: ... (4) Так, давайте. Нам нужно сделать - это !'
text_split = [f'({i}\n' for i in text.split('(')[1:]]
в итоге:
>>> text_split
[
'(1) Для начала Вам нужно создать задачу. \n',
'(2) После создания задачи Вам нужно написать письмо. \n',
'(3) Тест письма: ... \n',
'(4) Так, давайте. Нам нужно сделать - это !\n'
]
Если в тексте не ожидается скобок, а только в заголовке, то можно ориентироваться на открывающую скобку и указать, что после заголовка может быть любой текст, кроме скобки:
reg = re.findall('\(\d\)[^(]*', value)
Содержимое reg:
['(1) Для начала Вам нужно создать задачу. ', '(2) После создания задачи Вам нужно написать письмо. ', '(3) Тест письма: ...']
Шаблон [^(]* означает "любое количество любых символов, кроме ("
Другой вариант - используя re.split, разбить строку по шаблону, а потом склеить куски обратно:
reg = re.split('(\(\d\))', value)
reg = [a+b for a,b in zip(reg[1::2],reg[2::2])]
Значение reg:
['(1) Для начала Вам нужно создать задачу. ', '(2) После создания задачи Вам нужно написать письмо. ', '(3) Тест письма: ...']
Самый оптимальный способ — искать текст от числа в скобках до следующего числа в скобках или конца строки:
import re
value = "(1) Для начала Вам нужно создать задачу. \
(2) После создания задачи Вам нужно написать письмо. (3) Тест письма: ..."
print( re.findall(r'\(\d+\).*?(?=\s*(?:\(\d+\)|$))', value) )
# [
# '(1) Для начала Вам нужно создать задачу.',
# '(2) После создания задачи Вам нужно написать письмо.',
# '(3) Тест письма: ...'
# ]
См. пример кода в Python.
Подробности
\(\d+\)-(, одно и более цифр и).*?- ноль и более символов, отличных от перевода строки, как можно меньше(?=\s*(?:\(\d+\)|$))- до первого вхождения следующей последовательности символов:\s*- ноль и более пробельных символов(?:\(\d+\)|$)- или(, одно и более цифр и), или конец строки.
Если в совпадениях присутствуют переводы строки, добавьте модификатор re.S / re.DOTALL, re.findall(r'\(\d+\).*?(?=\s*(?:\(\d+\)|$))', value, re.DOTALL).
Если вы хотите проверить, есть ли точка/восклицательный (вопросительный) знак перед числом в скобках, испраьте шаблон на r'\(\d+\).*?[.?!](?=\s*(?:\(\d+\)|$))'.