Как разбить строку на слова python
Перейти к содержимому

Как разбить строку на слова python

  • автор:

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

Часто при работе с текстовыми данными стоит задача разделить строку на отдельные слова. Например, есть строка «Привет, мир! Это мой первый код на Python». Цель — преобразовать эту строку в список, где каждое слово будет отдельным элементом: [«Привет,», «мир!», «Это», «мой», «первый», «код», «на», «Python»].

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

Вот простой пример использования метода split() :

text = "Привет, мир! Это мой первый код на Python" words = text.split() print(words)

После выполнения этого кода будет выведен следующий результат:

['Привет,', 'мир!', 'Это', 'мой', 'первый', 'код', 'на', 'Python']

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

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

[Python] Разбить строку на слова

необходимо разбить строку на слова используя сделующие правила:

* Разделитель строк пробел

* Текст в двойных кавычках считается как отдельное слово

* В слове могут быть escape последовательности

То есть строка вида:

r’abc foo»» «„bar a\093d foo\ bar\ mode “ asdfa d \» df «’

должна быть преобразована в список:

[‘abc, ‘foo’, ‘»«’, ‘»«’, „bar“, ‘a\093d’, ‘foo\ bar\ mode’, ‘„asdfa d \\“ df »’]

Можете мне помочь?

ConnorMcLaud
11.06.10 18:27:18 MSD

Используй regexp. Напиши выражения для слов, строк и пустого места. Потом цикл, где проверяется соответствие и откусывается по кусочкам до полного уничтожения исходной строки.

vkos ★★
( 11.06.10 18:44:13 MSD )

Модуль shlex примерно это делает.

anonymous
( 11.06.10 18:52:07 MSD )

s= r’abc foo»» «„bar a\093d foo\ bar\ mode “ asdfa d \» df «’
s.split(» «)

Ну тогда пиши свою софтинку )))

детекткд нападение тролей на питон )))

shelA
( 11.06.10 19:45:44 MSD )
Ответ на: комментарий от vkos 11.06.10 18:44:13 MSD

>Используй regexp. Напиши выражения для слов, строк и пустого места.

Потом цикл, где проверяется соответствие и откусывается по кусочкам до

полного уничтожения исходной строки.

Порядок слов потеряется

ConnorMcLaud
( 11.06.10 19:52:13 MSD ) автор топика
Ответ на: комментарий от anonymous 11.06.10 18:52:07 MSD

>Модуль shlex примерно это делает.

Там есть два режима парсинга POSIX/не POSIX. Ни один из них мне полностью не подходит.

ConnorMcLaud
( 11.06.10 19:54:11 MSD ) автор топика

> Можете мне помочь?

Написать самому ручками — делов на 15 минут.

anonymous
( 11.06.10 19:59:23 MSD )
Ответ на: комментарий от ConnorMcLaud 11.06.10 19:52:13 MSD

Нет, проверять совпадение с началом строки. Если совпало и является словом/строкой — дописывать в список.

vkos ★★
( 11.06.10 20:05:00 MSD )
Ответ на: комментарий от anonymous 11.06.10 19:59:23 MSD

>Написать самому ручками — делов на 15 минут.

Всемогущий анон. На словах оно всегда так.

ConnorMcLaud
( 11.06.10 20:14:10 MSD ) автор топика

Одобряю, чем тупее новые «программисты» тем выше я могу потребовать зарплату.

ntp ★
( 11.06.10 22:04:32 MSD )

В качестве решения написал вот такую процедуру:

def split_by_words(st): #word can be either delimeted by spaces or be put in double quotes #escape sequences should be also taken into account wordlist = [] sepatators = [' '] quotes = ['"'] escapes = ['\\'] state = dict(in_none = 0, in_word=1, in_quotes=2) escape_state = False current_word = '' current_state = state['in_none'] for index, char in enumerate(st): if current_state == state['in_none']: if char in quotes: current_state = state['in_quotes'] elif char in escapes: escape_state = True current_state = state['in_word'] elif char in sepatators: current_state = state['in_none'] else: current_state = state['in_word'] elif current_state == state['in_word']: if escape_state: escape_state = False else: if char in sepatators: wordlist.append(current_word) current_word = '' current_state = state['in_none'] elif char in quotes: wordlist.append(current_word) current_word = '' current_state = state['in_quotes'] elif char in escapes: escape_state = True elif current_state == state['in_quotes']: if escape_state: escape_state = False else: if char in quotes: current_word += char wordlist.append(current_word) current_word = '' current_state = state['in_none'] elif char in escapes: escape_state = True if current_state != state['in_none']: current_word += char if index == len(st)-1 and current_word: wordlist.append(current_word) return wordlist 

ConnorMcLaud
( 15.06.10 13:46:02 MSD ) автор топика
Ответ на: комментарий от ConnorMcLaud 15.06.10 13:46:02 MSD

В качестве решения написал вот такую процедуру:

OMG! А так не проще 😉

def ParseW(Str): prevCh = '' words = [''] inQuote = False for Ch in Str: if(Ch==' ') and (prevCh!='\\') and (not inQuote): if(len(words[len(words)-1])!=0): words.append('') else: if(Ch=='"') and (prevCh!='\\') and (not inQuote): if(len(words[len(words)-1])!=0): words.append('') words[len(words)-1] += Ch inQuote = True elif(Ch=='"') and (prevCh!='\\') and (inQuote): words[len(words)-1] += Ch words.append('') inQuote = False else: words[len(words)-1] += Ch prevCh = Ch if(len(words[-1:][0])==0): words.pop() return words print ParseW(r'abc foo"" ""bar a\093d foo\ bar\ mode " asdfa d \" df "') 

Словарь: разбить строку на слова и сохранить слова и места, где они встречаются

Подскажите как данный алгоритм можно реализовать.Спасибо!

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как разбить строку на слова и записать в массив только 4-х буквенные слова
Как разбить строку на слова и записать в массив только 4-х буквенные слова? Максимальная длина.

Разбить строку на слова перед запятой и занести слова в ступенчатый массив
Условия задачи: Пользователь вводит текст вручную Можно использовать циклы(if foreach.

Разбить строку на слова (strtok) и сравнить эти слова со словом из Edit-a
Доброго времени суток, господа! Есть строка, её нужно разбить на слова и сравнить эти слова со.

Разбить строку на слова, добавить эти слова в массив строк
Привет всем! Понадобилось решить одну простенькую задачку: Разбить строку на слова, добавить.

2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Не знаю, что ты подразумевал под сохранением места, но если правильно понят тебя, то как-то так

1 2 3 4 5
string = 'привет это какая-то строка' result = {} for index, element in enumerate(string.split()): result[index] = element print(result)

Добавлено через 2 минуты
В тройке тоже самое, можно ещё сделать так

1 2 3
string = 'привет это какая-то строка' result = {index: element for index, element in enumerate(string.split())} print(result)

584 / 371 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4

Лучший ответ

Сообщение было отмечено Wilhelm_Art как решение

Решение

1 2 3 4
import re text = 'что где когда-то нафиг'; result = {m.start(0): m.group(0) for m in re.finditer(r"\b[^\s]+\b", text)} print(result)

Регистрация: 17.09.2012
Сообщений: 40

Задача непростая
Более подробно нужно сделать вот так

Основная задача:
Разбить строку на слова и сохранить слова и места, где они встречаются.

Разобьем задачу на части (декомпозиция):
1. Научиться выделять слова. Слова — это символы, разделенные символами-разделителями (separators)
2. Научиться сохранять выделенные слова.
3. Научиться выделять позиции каждого слова.

1. Нучиться выделять слова:
1.1. Научиться «пробежать» по строке — перебрать все ее символы по порядку
Если есть переменная строка с именем str, то перебрать ее символы — это выполнить цикл
for s in str:
.
при этом s — это переменная на каждом шаге цикла хранящая текущий символ
1.2. Научиться определять является ли символ разделителем
Если есть строка, содержащая символы sep, и строка s, которую мы хотим проверить на вхождение в sep, то необходимо выполнить
if s in sep:
.
else:
.
1.3. Научиться по началу и концу строки выделить слово
Если есть есть строка str и есть индекс начала begin и конца end, то подстроку можно получить
str[begin:end]

str = «abcdef»
print str[2:4]
Будет выведено ‘cd’. Индексация в строках, списках начинается с 0
1.4. Логические переменные
Л.П. — принимаю значения True или False
foo = True
if foo:
.
if not foo and True or False:
.

2. Сохранение в словарь
2.1. Создание пустого словаря
x = <>
2.2. Добавление нового ключа в словарь
x[3] = «abc»
x[«abc»] = 5

2.3. Проверка на наличие ключа в словаре
x.has_key(‘3’) —-> False
x.has_key(3) —-> True
2.4. Изменение значения по ключу
x[‘abc’] = x[3]
по ключу ‘abc’ станет тоже самое, что и по ключу 3

3. Подсказка: завести переменные —
— текущая позиция
— позиция начала текущего слова
— булевая переменная, означающая «сейчас внутри слова»

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

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