0

Как разбить строку по одному или нескольким разделителям в Python?

16

У меня есть форматированная строка из файла журнала, которая выглядит следующим образом:

>>> a="test                            result"

То есть, слово "test" и "result" разделены пробелами — вероятно, она была создана с использованием форматированной строки, которая задала "test" постоянное расстояние.

На простой разбиении это не сработает:

>>> a.split(" ")
['test', '', '', '', ... '', '', '', '', '', '', '', '', '', '', '', 'result']

Метод split(DELIMITER, COUNT) убрал некоторые ненужные значения:

>>> a.split(" ", 1)
['test', '                           result']

Это помогло, но, конечно, мне действительно нужно получить:

['test', 'result']

Я могу использовать split(), а затем применить map с strip(), но мне интересно, есть ли более питоновский способ сделать это.

Спасибо,

Адам

Обновление: Какое простое решение! Всем спасибо.

5 ответ(ов)

0

Вы можете использовать метод split() без аргументов, чтобы разделить строку на слова. Этот метод автоматически уберет все пробелы и вернет список слов. Вот пример:

a = "test                            result"
result = a.split()  # Разделяем строку
print(result)       # Вывод: ['test', 'result']

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

0

Вы можете использовать как функцию re.split, так и метод строки split для разделения строки по пробелам.

Вот пример, который демонстрирует это:

import re

a = "test                            result"

# Использование re.split для разделения по одному или нескольким пробелам
result_with_re = re.split(" +", a)
print(result_with_re)  # ['test', 'result']

# Использование метода split для разделения по пробелам
result_with_split = a.split()
print(result_with_split)  # ['test', 'result']

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

0

Проблем с использованием простого a.split() может быть несколько, в зависимости от контекста.

  1. Пробелы в строке: Метод split() без аргумента разделяет строку по пробелам и удаляет пустые строки из результата. Это значит, что если у вас есть несколько подряд идущих пробелов, они будут проигнорированы, и вы получите меньше элементов, чем ожидали. Например:

    a = "   Hello   World   "
    result = a.split()  # ['Hello', 'World']
    
  2. Кастомные разделители: Если вам нужно разделить строку по определенному разделителю (например, запятой или точке с запятой), использование a.split() без указания аргумента не подойдет. Вам нужно будет указать разделитель явно:

    a = "one,two,three"
    result = a.split(',')  # ['one', 'two', 'three']
    
  3. Тип данных: Если a не является строкой (например, у вас список или другой тип данных), вызов метода split() приведет к ошибке. Это нужно учитывать перед использованием метода.

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

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

0

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

import re

s = 'a.b....c......d.ef...g'
sp = re.compile(r'\.+').split(s)
print(sp)

Это даст следующий результат:

['a', 'b', 'c', 'd', 'ef', 'g']

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

0

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

Например, если у нас есть строка с разделителем запятая:

s = "Python,is,,more,,,,,flexible"

Можно использовать функцию filter() в сочетании с lambda, чтобы удалить пустые строки из результата:

str_list = list(filter(lambda x: len(x) > 0, s.split(",")))

Таким образом, получим желаемый список строк без пустых элементов:

print(str_list)
# Вывод: ['Python', 'is', 'more', 'flexible']

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь