Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
 Аватар для SofyaParker
0 / 0 / 0
Регистрация: 13.09.2015
Сообщений: 2

Регулярные выражение, вывод предложений

26.10.2018, 23:07. Показов 6212. Ответов 3

Студворк — интернет-сервис помощи студентам
Всем привет!
Новичок в Питоне и в текстовом анализе. Нуждаюсь в помощи: из текстового файла считывается русский текст. Необходимо разбить текст на предложения и вывести их. С этим я справилась:
Python
1
2
3
p = re.compile("([ а-яА-Я]+[.|!|?])")
for line in file:
    print(p.findall(line))
Но в файле существуют строки, в которых в конце не ставится пунктуационный знак (забыли, например, его поставить) и сразу переходит на новую строку. Предложения без знака на конце упускаются, хотя их тоже нужно вывести. Подскажите, пожалуйста, что необходимо добавить в выражение. Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.10.2018, 23:07
Ответы с готовыми решениями:

Регулярные выражение
Приветствую, у меня такая задача: "Найти все ссылки вида "<a href=" ">" и вывести список сайтов, на документы которых он ссылается". Я...

Регулярные выражение. Поиск
Здравствуйте. Подскажите пожалуйста со следующим моментом: import re l="Jack lives in New York Park Hello city Ann lives in New ...

Вывод предложений
Написать два класса: LeftParagraph и RightParagraph для печати абзаца с выравниванием по левому и правому краю. При инициализации...

3
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
27.10.2018, 00:44
\n - переход на новую строку. Добавить его в один из символов в []
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.10.2018, 02:37
Цитата Сообщение от SofyaParker Посмотреть сообщение
С этим я справилась
Ваша регулярка не работает. Разве что исключительно на вашем тексте.
(И зачем там вертикальная черта в регэкспе? Этот символ внутри квадратных скобок интерпретируется буквально.)
Не пишите велосипедов - сегментация предложений исключительно сложная задача текстпроцессинга и пока не существует механизмов для такой сегментации, работающих со 100% точностью (статистичеcкие и rule-based анализаторы дают ~95%).

Из готовых инструментов на Python более-менее приемлемую точность сегментации текста на предложения показывает модуль segtok. Он тоже работает на регулярных выражениях, но только они на порядок сложнее, чем вы себе можете представить.
Если же перед вам стоит чисто учебная задача и вы хотите обойтись ручной работой - используйте
Python
1
re.split(r'(?<=[.!?…])\s+', text)
Это простая, но правильная регулярка для простых предложений (без сокращений с точками, знаков ?! внутри предложения и прочих нюансов, о которые напрочь разбиваются любые самописные регулярки).

Сравните.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
text = '''\
Это было интересное время. Начало распада великой империи и рождение
сразу двух новых (одной из них даже предстоит намного пережить своего
создателя). Вот в этот-то уже давно бурлящий, но еще не плеснувший через
край котел упала, буквально с неба, еще одна человеческая жизнь. Каплей,
чтобы исчезнуть бесследно, крупинкой ли соли - чтобы растворится, оставив
после себя память, камнем на самое дно - наблюдать отстраненно за крушением
миропорядка или щепкой в водовороте событий, а может и пулей - насквозь.
Так ли это важно? Как жить и где умирать - каждый выбирает сам, а решает -
судьба.'''
 
print('-------1---------')  # Ваша регулярка
from io import StringIO
fd = StringIO(text)
p = re.compile("([ а-яА-Я]+[.|!|?])")
for idx, line in enumerate(fd,1):
    sent = p.findall(line)
    if sent:
        print('[{}]{}'.format(idx,*sent))
Code
1
2
3
4
5
6
-------1---------
[1]Это было интересное время.
[4] еще одна человеческая жизнь.
[7] насквозь.
[8]Так ли это важно?
[9]судьба.
Python
1
2
3
4
5
6
  
print('-------2---------') 
text = re.sub(r'\s+', ' ', text, flags=re.M)
for idx, sent in enumerate(re.split(r'(?<=[.!?…])\s+', text),1):
    sent = sent.replace('\n',' ')
    print('[{}]{}'.format(idx,sent))
Code
1
2
3
4
5
6
7
-------2---------
[1]Это было интересное время.
[2]Начало распада великой империи и рождение сразу двух новых (одной из них даже предстоит намного пережить своего создателя).
[3]Вот в этот-то уже давно бурлящий, но еще не плеснувший через край котел упала, буквально с неба, еще одна человеческая жизнь.
[4]Каплей, чтобы исчезнуть бесследно, крупинкой ли соли - чтобы растворится, оставив после себя память, камнем на самое дно - наблюдать отстраненно за крушением миропорядка или щепкой в водовороте событий, а может и пулей - насквозь.
[5]Так ли это важно?
[6]Как жить и где умирать - каждый выбирает сам, а решает - судьба.
Что касается предложений без точек - как вы собираетесь различать
предложение с пропущенной точкой и, например, это:

Природа жаждущих степей
Его в день гнева породила,
И зелень мертвую ветвей
И корни ядом напоила.


где с Новой строки и с Заглавной буквы все еще продолжается тоже самое предложение?
0
 Аватар для SofyaParker
0 / 0 / 0
Регистрация: 13.09.2015
Сообщений: 2
27.10.2018, 16:05  [ТС]
Цитата Сообщение от ioprst Посмотреть сообщение
\n - переход на новую строку. Добавить его в один из символов в []
Это получилось, спасибо!

Цитата Сообщение от Garry Galler Посмотреть сообщение
Что касается предложений без точек - как вы собираетесь различать
предложение с пропущенной точкой и, например, это:
Природа жаждущих степей
Его в день гнева породила,
И зелень мертвую ветвей
И корни ядом напоила.
где с Новой строки и с Заглавной буквы все еще продолжается тоже самое предложение?
Мой текст это набор жалоб и рекомендаций, который заполняется в электронной форме разными людьми. Не все ставят в конце своей жалобы точку, когда речь идет о том, чтобы что-то написать на клавиатуре.
Но спасибо за ответ!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.10.2018, 16:05
Помогаю со студенческими работами здесь

Регулярные выражения: поиск английских предложений среди русских
сижу несколько часов с https://regex101.com/r/ikORY1/2 и никак не пойму как английские слова вывести в отдельную группу не зависимо от...

Регулярные выражение
У меня какое-то такое регулярное выражение: p = re.compile(r&quot;\n +&quot;) Я хочу найти все совпадения и заменить их с помощью re.sub на...

Регулярные выражения: разделение предложений по точке и пробелу
public static List&lt;String&gt; DivisionBySentences(String tmp) { List&lt;String&gt; sentencesBuffer = new ArrayList&lt;&gt;(); Matcher...

Регулярные выражение
Доброго времени суток!! Я понимаю, что мой вопрос для кого-то покажется простым , но все же... С регулярными выражениями ранее не...

Регулярные выражение
Всем привет. Как с помощью pattern и matcher вывести все числа, но только после определенного слова, символа, или цифры? К примеру:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 31.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru