Перейти к содержимому

Как разделить текст на предложения в питоне

  • автор:

Как разбить текст на отдельные предложения? [дубликат]

Как разбить текст на отдельные предложения? Вариант со splitlines() не подходить, так как текст может быть записан в одну строку.

Отслеживать
задан 27 фев 2013 в 9:43
3,288 4 4 золотых знака 36 36 серебряных знаков 49 49 бронзовых знаков

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Выражение игнорирует
1980г.
100руб.
100р.
100коп.
100к.
и.т.д.
и.т.п.
а также совмещенные знаки препинания.
Код здесь
http://ideone.com/pNpffv

Отслеживать
ответ дан 27 фев 2013 в 17:46
17.9k 3 3 золотых знака 46 46 серебряных знаков 86 86 бронзовых знаков

@ReinRaus: мне кажется, лучше имплементировать такую семантику: после знака/ов препинания должен быть пробел, последующее слово должно быть с большой буквы. Год и цена могут вполне заканчивать предложение.

27 фев 2013 в 18:28

Э, так у нас же каждое новое предложение начинается с большой буквы? Почему бы не искать то место, где стоит точка и идет заглавная буква? Конечно, есть исключения, вроде имен, городов и т.п. — но это уже в целый проект выливается. Тьфу, дублирую @VladD ну да пофиг.

27 фев 2013 в 21:46
UPD Исправил вчерашние ошибки, оказывается проблема была не в плохом самочувствии, а в этой проблеме
28 фев 2013 в 7:54

Интересно, а вложенные предложения могут быть? Поясню, есть предложение, в нем начинается цитата (в кавычках. Или скобках, как здесь), а потом оно продолжается. Как такую фигню разбирать? По идее это вопрос на форум Русский Язык, но регистрироваться там (по поводу малозначащей для меня проблемы) неохота.

28 фев 2013 в 10:21

parts = all_text.split('.') 

Отслеживать
ответ дан 27 фев 2013 в 9:47
3,028 13 13 серебряных знаков 14 14 бронзовых знаков
Тогда уж хоть re.compile(«[. \n]»).split(all_text) re.split(«[. \n]», all_text)
27 фев 2013 в 9:54
Как быть с троеточием?
27 фев 2013 в 10:07
Если голодному дать рыбу — он наестся один раз, а если научить ловить рыбу — он будет сыт всегда…
27 фев 2013 в 10:09
Так должно быть получше с составными разделителями: re.split(«\\b[. \\n]+(?=\\s)», all_text)
27 фев 2013 в 10:20

@moden . называется многоточием (по крайней мере называлось, когда я учился в школе). Во-вторых, есть и такой знак . . Можно подойти к заданию «творчески» (удалять пустые строки). filter(lambda x:not re.match(«^\s*$», x), re.split(«[. \n]», all_text) Правда есть подозрение, что знаки препинания в результирующем списке должны присутствовать. И тогда — просто поиск по шаблону [^. \n]+[. \n]+ . Что тоже не даёт 100% правильного результата «В 1998г. был дефолт».

27 фев 2013 в 10:31

s = "Properties are a little different. They need a special declaration since they're handled in a very different way. (Hmmmm. I may have figured out an obvious way around that, but I want to get this out the door first.) Here's how you'd mock out calls to a property. Note that unlike other calls, all the calls to an overridden property must be played back in order." def srtip_sent(str_): separators = ['.', '?', '!'] start = 0 s_split = [] for i in range(len(str_)): if s[i] in separators: s_split.append(str_[start:i+1]) start = i + 1 return map(lambda s: s.strip(), s_split) srtip_sent(s) ['Properties are a little different.', "They need a special declaration since they're handled in a very different way.", '(Hmmmm.', '.', '.', 'I may have figured out an obvious way around that, but I want to get this out the door first.', ") Here's how you'd mock out calls to a property.", 'Note that unlike other calls, all the calls to an overridden property must be played back in order.'] 

Не очень корректно работает с составными знаками, например с троеточием.

Отслеживать
ответ дан 27 фев 2013 в 10:05
892 6 6 серебряных знаков 16 16 бронзовых знаков

. а ещё с инициалами, типа А. С. Пушкин . А ещё с внутренними знаками препинания, наподобие «Что за хрень?» — поинтересовалась Алиса.

Python разделить строку на списки

В этой статье мы расскажем, как можно разбивать строки на списки. Вы узнаете, как при этом использовать разделители (в частности — как отделять часть строки только по первому разделителю и как быть с последовательно идущими разделителями) и регулярные выражения. Безусловно, эта информация будет особенно полезна начинающим питонистам, но, возможно, и более опытные найдут для себя кое-что интересное.

Простое разделение строки и получение списка ее составляющих

Если вы хотите разбить любую строку на подстроки и составить из них список, вы можете просто воспользоваться методом split(sep=None, maxsplit=-1) . Этот метод принимает два параметра (опционально). Остановимся пока на первом из них — разделителе ( sep ).

Разделитель можно задать явно в качестве параметра, но можно и не задавать: в этом случае в его роли выступает пробел.

Пример использования метода split() без указания разделителя:

print("Python2 Python3 Python Numpy".split()) print("Python2, Python3, Python, Numpy".split())
['Python2', 'Python3', 'Python', 'Numpy'] ['Python2,', 'Python3,', 'Python,', 'Numpy']

Разделение строки с использованием разделителя

Python может разбивать строки по любому разделителю, указанному в качестве параметра метода split() . Таким разделителем может быть, например, запятая, точка или любой другой символ (или даже несколько символов).

Давайте рассмотрим пример, где в качестве разделителя выступает запятая и точка с запятой (это можно использовать для работы с CSV-файлами).

print("Python2, Python3, Python, Numpy".split(',')) print("Python2; Python3; Python; Numpy".split(';'))
['Python2', ' Python3', ' Python', ' Numpy'] ['Python2', ' Python3', ' Python', ' Numpy']

Как видите, в результирующих списках отсутствуют сами разделители.

Если вам нужно получить список, в который войдут и разделители (в качестве отдельных элементов), можно разбить строку по шаблону, с использованием регулярных выражений (см. документацию re.split). Когда вы берете шаблон в захватывающие круглые скобки, группа в шаблоне также возвращается как часть результирующего списка.

import re sep = re.split(',', 'Python2, Python3, Python, Numpy') print(sep) sep = re.split('(,)', 'Python2, Python3, Python, Numpy') print(sep)
['Python2', ' Python3', ' Python', ' Numpy'] ['Python2', ',', ' Python3', ',', ' Python', ',', ' Numpy']

Если вы хотите, чтобы разделитель был частью каждой подстроки в списке, можно обойтись без регулярных выражений и использовать list comprehensions:

text = 'Python2, Python3, Python, Numpy' sep = ',' result = [x+sep for x in text.split(sep)] print(result)
['Python2,', ' Python3,', ' Python,', ' Numpy,']

Разделение многострочной строки (построчно)

Создать список из отдельных строчек многострочной строки можно при помощи того же метода split() , указав в качестве разделителя символ новой строки \n . Если текст содержит лишние пробелы, их можно удалить при помощи методов strip() или lstrip() :

str = """ Python is cool Python is easy Python is mighty """ list = [] for line in str.split("\n"): if not line.strip(): continue list.append(line.lstrip()) print(list)
['Python is cool', 'Python is easy', 'Python is mighty']

Разделение строки-словаря и преобразование ее в списки или словарь

Допустим, у нас есть строка, по сути являющаяся словарем и содержащая пары ключ-значение в виде key => value . Мы хотим получить эти пары в виде списков или настоящего словаря. Вот простой пример, как получить словарь и два списка:

dictionary = """\ key1 => value1 key2 => value2 key3 => value3 """ mydict = <> listKey = [] listValue = [] for line in dictionary.split("\n"): if not line.strip(): continue k, v = [word.strip() for word in line.split("=>")] mydict[k] = v listKey.append(k) listValue.append(v) print(mydict) print(listKey) print(listValue)
 ['key1', 'key2', 'key3'] ['value1', 'value2', 'value3']

Отделение указанного количества элементов

Метод split() имеет еще один опциональный параметр — maxsplit . С его помощью можно указать, какое максимальное число «разрезов» нужно сделать. По умолчанию maxsplit=-1 , это означает, что число разбиений не ограничено.

Если вам нужно отделить от строки несколько первых подстрок, это можно сделать, указав нужное значение maxsplit . В этом примере мы «отрежем» от строки первые три элемента, отделенные запятыми:

str = "Python2, Python3, Python, Numpy, Python2, Python3, Python, Numpy" data = str.split(", ",3) for temp in data: print(temp)
Python2 Python3 Python Numpy, Python2, Python3, Python, Numpy

Разделение строки при помощи последовательно идущих разделителей

Если вы для разделения строки используете метод split() и не указываете разделитель, то разделителем считается пробел. При этом последовательно идущие пробелы трактуются как один разделитель.

Но если вы указываете определенный разделитель, ситуация меняется. При работе метода будет считаться, что последовательно идущие разделители разделяют пустые строки. Например, ‘1,,2’.split(‘,’) вернет [‘1’, », ‘2’] .

Если вам нужно, чтобы последовательно идущие разделители все-таки трактовались как один разделитель, нужно воспользоваться регулярными выражениями. Разницу можно видеть в примере:

import re print('Hello1111World'.split('1')) print(re.split('1+', 'Hello1111World' ))
['Hello', '', '', '', 'World'] ['Hello', 'World']

Деление строки по заглавным буквам в Python

Для деления по заглавным буквам строки записанной слитно, необходимо сначала изменить строку, добавить пробел перед заглавной буквой, а потом разделить строку по разделителю «пробел» стандартным методом str.split() .

Для добавления пробела перед заглавной буквой воспользуемся функцией re.sub() модуля re , а в регулярном выражении используем группу с захватом и обратную ссылку.

# исходная строка >>> line = 'МамаМылаРаму' >>> import re >>> re.sub(r'([А-Я])', r' \1', line).split() # ['Мама', 'Мыла', 'Раму'] 
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Преобразование строки в число
  • Строку в список, кортеж или множество символов
  • Одинарные, двойные и тройные кавычки в строке Python
  • Вывод специальных символов в строке Python «как есть»
  • Объединение и повторение строк
  • Индексирование строк
  • Использование срезов строк
  • Cрез строки Python от заданного символа/знака до конца строки
  • Создание макета для печати базовыми методами строк
  • Способы форматирования текстовых строк
  • Подсчет повторений слов в тексте, деление строки на список слов
  • Удаление слова из строки Python по фрагменту или шаблону
  • Удаление пунктуации из строки
  • Деление строки по заглавным буквам
  • Создание отчетов и писем по шаблонам

ХОЧУ ПОМОЧЬ
ПРОЕКТУ

Руководство по использованию метода split в Python

Строки — отличный инструмент в руках Python-разработчиков. В Python строка —
это последовательность символов в кавычках. Она может включать числа, буквы и
символы. С помощью Python строку можно разделить на список подстрок по
определенному разделителю. Это делается с помощью метода split .

В этом материале разберем особенности его использования.

Что делает split в Python?

Функция split сканирует всю строку и разделяет ее в случае нахождения разделителя.
В строке должен быть как минимум один разделитель. Им может выступать в том
числе и символ пробела. Пробел — разделитель по умолчанию.

Если параметр на задать, то разделение будет выполнено именно по символу
пробела.

Синтаксис функции следующий:

string.split(separator*, maxsplit*) 

Параметр separator — необязательный, но он позволяет задать разделитель
вручную.

Параметр maxsplit определяет максимальное количество разделений. Значение по
умолчанию — -1, будут выполнены все разделения.

Как разделить строку в Python

Метод .split() разделяет основную строку по разделителю и возвращает список строк.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *