Как в Python разбить строку на символы
3 простых способа, которые можно использовать в работе и пет-проектах.


Иллюстрация: Оля Ежак для Skillbox Media

Дмитрий Зверев
Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.
А зачем, собственно, в Python разбивать строки на символы? Например, для того, чтобы проверять правильность пароля и почты клиента, когда он регистрируется в онлайн-сервисе.
Скажем, на нашем сайте есть требование: в пароле должны быть как минимум одна заглавная, одна строчная буква и одна цифра. Мы можем написать скрипт на Python, который проверяет каждый символ и выносит вердикт: верный пароль или нет.
Если вы ещё не знакомы с Python, советуем прочитать нашу статью, в которой мы рассказываем, как быстро и бесплатно изучить этот замечательный язык программирования.
Циклы for и while, или метод «в лоб»
Как работает: проходит по каждому символу в строке и добавляет его в отдельный список.
Самый примитивный способ поделить строку на символы — сделать это с помощью циклов. Выбираем нужные символы из строки и складываем в список.
Выглядит это так:
Генераторы списков — то же, что и for, но короче
Как работает: делает то же самое, что и цикл for, но записывается всего в одну строчку.
password = 'f#da94AAd' symbols = [symbol for symbol in password] print(symbols)
['f', '#', 'd', 'a', '9', '4', 'A', 'A', 'd']
Здесь мы использовали встроенную в Python возможность — list comprehension. Термин сложно перевести на русский, поэтому его называют генератором списков.
Суть простая — это обычный цикл for, который записывается в одну строчку. Чтобы понять, как он работает, перепишем код выше в виде обычного цикла for:
# symbols = [symbol for symbol in password] symbols = [] for symbol in password: symbols += symbol
В короткой записи мы указываем, из какого списка берём элементы — in password, как будем именовать текущий элемент — for symbol, и что делаем с самим элементом — просто сохранять в неизменном виде: symbol.
Генераторы списков позволяют записывать длинный цикл for в одну строку. Это полезно, когда не нужно сильно изменять данные, а нужно просто сохранить их.
Функция list — для самых продуктивных
Как работает: делает то же самое, что и циклы for и while, но сокращает количество строк кода.
Когда не хотим писать даже пару строк кода, но разложить строку на символы всё ещё нужно, на помощь приходит функция list. Она превращает набор элементов в список:
password = 'f#da94AAd' symbols = list(password) print(symbols)
['f', '#', 'd', 'a', '9', '4', 'A', 'A', 'd']
Получили такой же результат, но использовали всего одну строку кода. Очень неплохо.
Проверим работу функции проверки пароля:
if check_password(symbols): print('Пароль верный') else: print('Пароль неверный')
'Пароль верный'
Функция list — самая лаконичная. Чтобы получить список символов, из которых состоит строка, достаточно просто вызвать функцию со строкой в качестве аргумента.
Что запомнить
Выделим главные тезисы из статьи:
- использование циклов for и while — это самый простой, но не самый эффективный способ достать из строки все символы;
- генераторы списков — это удобная и короткая замена цикла for;
- применение функции list — самый короткий способ разбить строку на символы.
Читайте также:
- Словари в Python: что нужно знать и как пользоваться
- «Прошёл модуль курса и начал рассылать резюме»: музыкант, который стал питонистом
- Создаём первую игру на Python и Pygame
3.7. Java примеры – Разбиение строки на слова и символы в массив и по разделителю
Следующий пример показывает как разделить строку в Java по разделителю с помощью метода split() и вывести подстроку.
public class Example < public static void main(String args[]) < System.out.println("Пример 1:"); String str = "разделить-строку-по-разделителю"; String[] subStr; String delimeter = "-"; // Разделитель subStr = str.split(delimeter); // Разделения строки str с помощью метода split() // Вывод результата на экран for(int i = 0; i < subStr.length; i++) < System.out.println(subStr[i]); >// Ещё один пример разделения System.out.println("\nПример 2:"); str = "разделить.строку.по разделителю"; delimeter = "\\."; // Разделитель subStr = str.split(delimeter); // Вывод результата на экран for(int i = 0; i < subStr.length; i++) < System.out.println(subStr[i]); >// Ещё один пример разделения с использованием порога System.out.println("\nПример 3:"); str = "разделить!строку!по!разделителю"; delimeter = "!"; // Разделитель subStr = str.split(delimeter, 3); // Разбить строку str с порогом равным 3, который означает, как много подстрок, должно быть возвращено. // Вывод результата на экран for(int i = 0; i < subStr.length; i++) < System.out.println(subStr[i]); >> >
Результат
Получим следующий результат:
Пример 1: разделить строку по разделителю Пример 2: разделить строку по разделителю Пример 3: разделить строку по!разделителю
Решение 2: разбить строку на слова
Ниже продемонстрирован пример, который позволяет в Java разбить строку на слова.
public class Example < public static void main(String args[]) < String str = "разбить строку на слова"; String[] words = str.split("\\s"); // Разбиение строки на слова с помощью разграничителя (пробел) // Вывод на экран for(String subStr:words) < System.out.println(subStr); >> >
Результат
Получим следующий результат:
разбить строку на слова
Решение 3: разбить строку на символы в массив
Следующий пример показывает как разбить строку на массив по символу. Для этого просто преобразуем строку в массив с помощью метода toCharArray().
public class Example < public static void main(String args[]) < String str = "ProgLang"; char[] strToArray = str.toCharArray(); // Преобразуем строку str в массив символов (char) // Вывод массива на экран for(int i = 0; i < strToArray.length; i++) < System.out.print(strToArray[i] + " "); // Для наглядности вставим пробел между индексами >> >
Результат
Получим следующий результат:
P r o g L a n g
Оглавление
- 1. Java примеры – Использование кода на практике
- 2. Java примеры – Окружающая среда
- 2.1. Java примеры – Скомпилировать файл
- 2.2. Java примеры – Установить путь к нескольким классам
- 2.3. Java примеры – Отладка java-файла
- 2.4. Java примеры – Установить путь к классу
- 2.5. Java примеры – Просмотреть текущий путь класса
- 2.6. Java примеры – Установить назначение файла класса
- 2.7. Java примеры – Запустить скомпилированный java-файл класса
- 2.8. Java примеры – Узнать версию Java
- 2.9. Java примеры – Установить путь к классу в .jar-файле или .zip-файле
- 3. Java примеры – Строки
- 3.1. Java примеры – Сравнить две строки
- 3.2. Java примеры – Найти последнее вхождение подстроки внутри подстроки
- 3.3. Java примеры – Удалить нужный символ из строки
- 3.4. Java примеры – Заменить символ в строке
- 3.5. Java примеры – Вывод в обратном порядке
- 3.6. Java примеры – Нахождение символа или слова в строке
- 3.7. Java примеры – Разбиение строки на слова и символы
- 3.8. Java примеры – Преобразование строки в верхний регистр
- 3.9. Java примеры – Найти слово в строке
- 3.10. Java примеры – Сравнить производительность создания строки
- 3.11. Java примеры – Оптимизировать создание строк
- 3.12. Java примеры – Форматирование строк
- 3.13. Java примеры – Конкатенация строк
- 3.14. Java примеры – Определить код Юникода символа в строке
- 3.15. Java примеры – Буферизация строк
- 4. Java примеры – Массивы
- 4.1. Java примеры – Сортировка массива и поиск элемента
- 4.2. Java примеры – Метод сортировки массива, вставить элемент в массив
- 4.3. Java примеры – Размер двумерного массива
- 4.4. Java примеры – Обратный порядок массива, переворачиваем массив
- 4.5. Java примеры – Как выводить массивы и двумерные массивы в консоль
- 4.6. Java примеры – Найти максимальный и минимальный элемент массива
- 4.7. Java примеры – Соединить два массива в один
- 4.8. Java примеры – Как заполнить массив числами
- 4.9. Java примеры – Увеличить массив после инициализации
- 4.10. Java примеры – Сравнение двух массивов
- 4.11. Java примеры – Удаление элемента из массива
- 4.12. Java примеры – Удаление массива из другого массива
- 4.13. Java примеры – Одинаковые элементы массивов
- 4.14. Java примеры – Поиск в массиве
- 4.15. Java примеры – Равенство двух массивов
- 4.16. Java примеры – Сравнить массивы
- 5. Java примеры – Дата и время
- 5.1. Java примеры – Форматирование времени в формате AM-PM
- 5.2. Java примеры – Получение названия и номера текущего месяца
- 5.3. Java примеры – Получить текущее время в часах и минутах
- 5.4. Java примеры – Вывести текущее время и дату
- 5.5. Java примеры – Вывести текущее время в 24-часовом формате
- 5.6. Java примеры – Получить текущий месяц
- 5.7. Java примеры – Получить текущие секунды
- 5.8. Java примеры – Получить короткое название месяца
- 5.9. Java примеры – Получить день недели
- 5.10. Java примеры – Добавление времени к дате
- 5.11. Java примеры – Отображение времени в формате другой страны
- 5.12. Java примеры – Отображение времени на разных языках
- 5.13. Java примеры – Прокрутить часы и месяцы
- 5.14. Java примеры – Получить номер недели и месяц в году
- 5.15. Java примеры – Форматы текущей даты
- 6. Java примеры – Методы
- 6.1. Java примеры – Перезагрузка методов
- 6.2. Java примеры – Вывод массива с использованием метода
- 6.3. Java примеры – Решение Ханойской башни
- 6.4. Java примеры – Последовательность чисел Фибоначчи
- 6.5. Java примеры – Вычисление факториала числа
- 6.6. Java примеры – Переопределение метода
- 6.7. Java примеры – Вывод массива с использованием метода
- 6.8. Java примеры – Использование оператора break
- 6.9. Java примеры – Использование оператора continue
- 6.10. Java примеры – Использование метки в методе
- 6.11. Java примеры – Использование операторов enum и switch
- 6.12. Java примеры – Использование конструктора enum
Извлечение подстрок из строки
В этой статье рассматриваются различные методы извлечения частей строки.
- Используйте метод Split, если нужные подстроки разделены символом-разделителем (или символами).
- Регулярные выражения удобно использовать, когда строка соответствует фиксированному шаблону.
- Используйте сочетание методов IndexOf и Substring, если не хотите извлекать все подстроки из строки.
Метод String.Split
String.Split предоставляет несколько перегрузок, которые позволяют разбить строку на группу подстрок, основанных на одном или нескольких указанных символах-разделителях. Вы можете ограничить общее число подстрок в окончательном результате, обрезав пробелы в подстроках или исключив пустые подстроки.
Ниже показаны три различные перегрузки String.Split() . Первый пример вызывает перегрузку Split(Char[]) без передачи знаков разделения. Если не указать символы-разделители, String.Split() будет использовать для разделения строки разделители по умолчанию, которые являются пробелами.
string s = "You win some. You lose some."; string[] subs = s.Split(); foreach (string sub in subs) < Console.WriteLine($"Substring: "); > // This example produces the following output: // // Substring: You // Substring: win // Substring: some. // Substring: You // Substring: lose // Substring: some.
Dim s As String = "You win some. You lose some." Dim subs As String() = s.Split() For Each substring As String In subs Console.WriteLine("Substring: ", substring) Next ' This example produces the following output: ' ' Substring: You ' Substring: win ' Substring: some. ' Substring: You ' Substring: lose ' Substring: some.
Как видите, символы-точки ( . ) содержатся в двух подстроках. Если вы хотите исключить символы-точки, добавьте символ-точку как дополнительный символ разделителя. В следующем примере показано, как это сделать.
string s = "You win some. You lose some."; string[] subs = s.Split(' ', '.'); foreach (string sub in subs) < Console.WriteLine($"Substring: "); > // This example produces the following output: // // Substring: You // Substring: win // Substring: some // Substring: // Substring: You // Substring: lose // Substring: some // Substring:
Dim s As String = "You win some. You lose some." Dim subs As String() = s.Split(" "c, "."c) For Each substring As String In subs Console.WriteLine("Substring: ", substring) Next ' This example produces the following output: ' ' Substring: You ' Substring: win ' Substring: some ' Substring: ' Substring: You ' Substring: lose ' Substring: some ' Substring:
Точки исчезли из подстрок, однако теперь появились две дополнительные пустые подстроки. Пустые подстроки представляют подстроку между словом и точкой после него. Чтобы исключить из результирующего массива пустые подстроки, вызовите перегрузку Split(Char[], StringSplitOptions) и укажите StringSplitOptions.RemoveEmptyEntries для параметра options .
string s = "You win some. You lose some."; char[] separators = new char[] < ' ', '.' >; string[] subs = s.Split(separators, StringSplitOptions.RemoveEmptyEntries); foreach (string sub in subs) < Console.WriteLine($"Substring: "); > // This example produces the following output: // // Substring: You // Substring: win // Substring: some // Substring: You // Substring: lose // Substring: some
Dim s As String = "You win some. You lose some." Dim separators As Char() = New Char() Dim subs As String() = s.Split(separators, StringSplitOptions.RemoveEmptyEntries) For Each substring As String In subs Console.WriteLine("Substring: ", substring) Next ' This example produces the following output: ' ' Substring: You ' Substring: win ' Substring: some ' Substring: You ' Substring: lose ' Substring: some
Регулярные выражения
Если строка соответствует фиксированному шаблону, используйте регулярное выражение для извлечения и обработки ее элементов. Например, если строки принимают форму «числооперанда чисел «, можно использовать регулярное выражение для извлечения и обработки элементов строки. Ниже приведен пример:
String[] expressions = < "16 + 21", "31 * 3", "28 / 3", "42 - 18", "12 * 7", "2, 4, 6, 8" >; String pattern = @"(\d+)\s+([-+*/])\s+(\d+)"; foreach (string expression in expressions) < foreach (System.Text.RegularExpressions.Match m in System.Text.RegularExpressions.Regex.Matches(expression, pattern)) < int value1 = Int32.Parse(m.Groups[1].Value); int value2 = Int32.Parse(m.Groups[3].Value); switch (m.Groups[2].Value) < case "+": Console.WriteLine("= ", m.Value, value1 + value2); break; case "-": Console.WriteLine(" = ", m.Value, value1 - value2); break; case "*": Console.WriteLine(" = ", m.Value, value1 * value2); break; case "/": Console.WriteLine(" = ", m.Value, value1 / value2); break; > > > // The example displays the following output: // 16 + 21 = 37 // 31 * 3 = 93 // 28 / 3 = 9.33 // 42 - 18 = 24 // 12 * 7 = 84
Dim expressions() As String = Dim pattern As String = "(\d+)\s+([-+*/])\s+(\d+)" For Each expression In expressions For Each m As Match In Regex.Matches(expression, pattern) Dim value1 As Integer = Int32.Parse(m.Groups(1).Value) Dim value2 As Integer = Int32.Parse(m.Groups(3).Value) Select Case m.Groups(2).Value Case "+" Console.WriteLine(" = ", m.Value, value1 + value2) Case "-" Console.WriteLine(" = ", m.Value, value1 - value2) Case "*" Console.WriteLine(" = ", m.Value, value1 * value2) Case "/" Console.WriteLine(" = ", m.Value, value1 / value2) End Select Next Next ' The example displays the following output: ' 16 + 21 = 37 ' 31 * 3 = 93 ' 28 / 3 = 9.33 ' 42 - 18 = 24 ' 12 * 7 = 84
Шаблон регулярного выражения (\d+)\s+([-+*/])\s+(\d+) определяется следующим образом:
| Шаблон | Описание |
|---|---|
| (\d+) | Совпадение с одной или несколькими десятичными цифрами. Это первая группа записи. |
| \s+ | Совпадение с одним или несколькими пробелами. |
| ([-+*/]) | Совпадение со знаком арифметического оператора (+, -, *, или /). Это вторая группа записи. |
| \s+ | Совпадение с одним или несколькими пробелами. |
| (\d+) | Совпадение с одной или несколькими десятичными цифрами. Это третья группа записи. |
Вы также можете использовать регулярное выражение для извлечения подстрок из строки на основе шаблона, а не фиксированного набора символов. Это распространенный сценарий, если происходит одно из следующих условий:
- Один или несколько символов-разделителей не всегда служат разделителями в экземпляре String.
- Последовательность и количество символов-разделителей являются изменяемыми или неизвестными.
Например, метод Split нельзя использовать для разделения следующей строки, поскольку число символов \n (новая строка) является изменяемым и они не всегда являются разделителями.
[This is captured\ntext.]\n\n[\n[This is more captured text.]\n] \n[Some more captured text:\n Option1\n Option2][Terse text.]
Регулярное выражение может легко разделить эту строку, как показано ниже.
String input = "[This is captured\ntext.]\n\n[\n" + "[This is more captured text.]\n]\n" + "[Some more captured text:\n Option1" + "\n Option2][Terse text.]"; String pattern = @"\[([^\[\]]+)\]"; int ctr = 0; foreach (System.Text.RegularExpressions.Match m in System.Text.RegularExpressions.Regex.Matches(input, pattern)) < Console.WriteLine(": ", ++ctr, m.Groups[1].Value); > // The example displays the following output: // 1: This is captured // text. // 2: This is more captured text. // 3: Some more captured text: // Option1 // Option2 // 4: Terse text.
Dim input As String = String.Format("[This is capturedtext.]" + "[[This is more " + "captured text.]" + "[Some more captured text:" + " Option1" + " Option2][Terse text.]", vbCrLf) Dim pattern As String = "\[([^\[\]]+)\]" Dim ctr As Integer = 0 For Each m As Match In Regex.Matches(input, pattern) ctr += 1 Console.WriteLine(": ", ctr, m.Groups(1).Value) Next ' The example displays the following output: ' 1: This is captured ' text. ' 2: This is more captured text. ' 3: Some more captured text: ' Option1 ' Option2 ' 4: Terse text.
Шаблон регулярного выражения \[([^\[\]]+)\] определяется следующим образом:
| Шаблон | Описание |
|---|---|
| \[ | Совпадение с открывающей скобой. |
| ([^\[\]]+) | Совпадение с любым символом, который не является открывающей или закрывающей скобкой, один или несколько раз. Это первая группа записи. |
| \] | Совпадение с закрывающей скобкой. |
Метод Regex.Split практически идентичен методу String.Split, за исключением того, что он разделяет строку на основе шаблона регулярного выражения, а не фиксированной кодировки. Например, в следующем примере метод Regex.Split используется для разделения строки, которая содержит подстроки, разделенные с помощью различных сочетаний дефисов и других символов.
String input = "abacus -- alabaster - * - atrium -+- " + "any -*- actual - + - armoire - - alarm"; String pattern = @"\s-\s?[+*]?\s?-\s"; String[] elements = System.Text.RegularExpressions.Regex.Split(input, pattern); foreach (string element in elements) Console.WriteLine(element); // The example displays the following output: // abacus // alabaster // atrium // any // actual // armoire // alarm
Dim input As String = "abacus -- alabaster - * - atrium -+- " + "any -*- actual - + - armoire - - alarm" Dim pattern As String = "\s-\s?[+*]?\s?-\s" Dim elements() As String = Regex.Split(input, pattern) For Each element In elements Console.WriteLine(element) Next ' The example displays the following output: ' abacus ' alabaster ' atrium ' any ' actual ' armoire ' alarm
Шаблон регулярного выражения \s-\s?[+*]?\s?-\s определяется следующим образом:
| Шаблон | Описание |
|---|---|
| \s- | Совпадение с пробелом, за которым следует дефис. |
| \s? | Совпадение с нулем или одним символом пробела. |
| [+*]? | Совпадение с нулем или единичное появление символа + или *. |
| \s? | Совпадение с нулем или одним символом пробела. |
| -\s | Совпадение с дефисом, за которым следует пробел. |
Методы String.IndexOf и String.Substring
Если вам нужны все подстроки в строке, можете использовать один из методов сравнения строк, которые возвращают индекс начала сопоставления. Затем для извлечения нужных подстрок можно будет вызвать метод Substring. К методам сравнения строк можно отнести:
- IndexOf, возвращающий отсчитываемый от нуля индекс первого появления символа или строки в экземпляре строки.
- IndexOfAny, возвращающий отсчитываемый от нуля индекс в текущем экземпляре строки первого появления любого символа в массиве символов.
- LastIndexOf, возвращающий отсчитываемый от нуля индекс последнего появления символа или строки в экземпляре строки.
- LastIndexOfAny, возвращающий отсчитываемый от нуля индекс в текущем экземпляре строки последнего вхождения любого символа в массиве символов.
В следующем примере метод IndexOf используется для поиска точек в строке. После чего в нем используется метод Substring для возврата полных предложений.
String s = "This is the first sentence in a string. " + "More sentences will follow. For example, " + "this is the third sentence. This is the " + "fourth. And this is the fifth and final " + "sentence."; var sentences = new List(); int start = 0; int position; // Extract sentences from the string. do < position = s.IndexOf('.', start); if (position >= 0) < sentences.Add(s.Substring(start, position - start + 1).Trim()); start = position + 1; >> while (position > 0); // Display the sentences. foreach (var sentence in sentences) Console.WriteLine(sentence); // The example displays the following output: // This is the first sentence in a string. // More sentences will follow. // For example, this is the third sentence. // This is the fourth. // And this is the fifth and final sentence.
Dim input As String = "This is the first sentence in a string. " + "More sentences will follow. For example, " + "this is the third sentence. This is the " + "fourth. And this is the fifth and final " + "sentence." Dim sentences As New List(Of String) Dim start As Integer = 0 Dim position As Integer ' Extract sentences from the string. Do position = input.IndexOf("."c, start) If position >= 0 Then sentences.Add(input.Substring(start, position - start + 1).Trim()) start = position + 1 End If Loop While position > 0 ' Display the sentences. For Each sentence In sentences Console.WriteLine(sentence) Next End Sub ' The example displays the following output: ' This is the first sentence in a string. ' More sentences will follow. ' For example, this is the third sentence. ' This is the fourth. ' And this is the fifth and final sentence.
См. также
- Базовые операции со строками в .NET
- Регулярные выражения .NET
- Анализ строк с помощью String.Split в C#
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Разделение строки на список слов в Python
Часто при работе с текстовыми данными стоит задача разделить строку на отдельные слова. Например, есть строка «Привет, мир! Это мой первый код на Python». Цель — преобразовать эту строку в список, где каждое слово будет отдельным элементом: [«Привет,», «мир!», «Это», «мой», «первый», «код», «на», «Python»].
В языке программирования Python для разделения строки на слова используется встроенный метод split() . Он разделяет строку на подстроки на основе указанного разделителя. Если разделитель не указан, метод split() разделяет строку по пробелам.
Вот простой пример использования метода split() :
text = "Привет, мир! Это мой первый код на Python" words = text.split() print(words)
После выполнения этого кода будет выведен следующий результат:
['Привет,', 'мир!', 'Это', 'мой', 'первый', 'код', 'на', 'Python']
Важно отметить, что разделители (в данном случае пробелы) не включаются в полученный список.
Таким образом, метод split() позволяет легко и быстро разделить строку на отдельные слова и сохранить их в списке для дальнейшей обработки.