Подтвердить что ты не робот

Разделить запятую и пробельные пробелы в Python

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

>>> string = "blah, lots  ,  of ,  spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots  ', '  of ', '  spaces', ' here ']

Я бы предпочел бы удалить пробелы следующим образом:

['blah', 'lots', 'of', 'spaces', 'here']

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

4b9b3361

Ответ 2

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

>>> import re
>>> string = "  blah, lots  ,  of ,  spaces, here "
>>> pattern = re.compile("^\s+|\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['blah', 'lots', 'of', 'spaces', 'here']

Это работает, даже если ^\s+ не соответствует:

>>> string = "foo,   bar  "
>>> print([x for x in pattern.split(string) if x])
['foo', 'bar']
>>>

Вот почему вам нужно ^\s +:

>>> pattern = re.compile("\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['  blah', 'lots', 'of', 'spaces', 'here']

Посмотрите начальные пробелы в blah?

Уточнение: выше используется интерпретатор Python 3, но результаты в Python 2 одинаковы.

Ответ 3

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

>>> import re
>>> re.sub(r'\s', '', string).split(',')
['blah', 'lots', 'of', 'spaces', 'here']

\s соответствует любому символу пробела, и мы просто заменяем его пустой строкой ''. Вы можете найти более подробную информацию здесь: http://docs.python.org/library/re.html#re.sub

Ответ 4

Я пришел, чтобы добавить:

map(str.strip, string.split(','))

но видел, что Джейсон Орендорф уже упоминал в комментарий.

Чтение Гленна Мейнарда в одном и том же ответе, предлагающем понимание списков по карте, я начал задаваться вопросом, почему. Я предположил, что он предназначен для служебных целей, но, разумеется, он имел в виду стилистические причины или что-то еще (Гленн?).

Итак, быстрый (возможно, ошибочный?) тест на моем ящике, применяющий три метода в цикле, показал:

[word.strip() for word in string.split(',')]
$ time ./list_comprehension.py 
real    0m22.876s

map(lambda s: s.strip(), string.split(','))
$ time ./map_with_lambda.py 
real    0m25.736s

map(str.strip, string.split(','))
$ time ./map_with_str.strip.py 
real    0m19.428s

делает map(str.strip, string.split(',')) победителем, хотя кажется, что все они находятся на одном и том же этапе.

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

Edit:

Python 2.6.5 на Ubuntu 10.04

Ответ 5

Просто удалите пустое пространство из строки, прежде чем разделить его.

mylist = my_string.replace(' ','').split(',')

Ответ 6

import re
result=[x for x in re.split(',| ',your_string) if x!='']

это отлично работает для меня.

Ответ 7

map(lambda s: s.strip(), mylist) будет немного лучше, чем явный цикл. Или за все сразу: map(lambda s:s.strip(), string.split(','))

Ответ 8

s = 'bla, buu, jii'

sp = []
sp = s.split(',')
for st in sp:
    print st

Ответ 9

re (как в регулярных выражениях) позволяет разбивать сразу несколько символов:

$ string = "blah, lots  ,  of ,  spaces, here "
$ re.split(', ',string)
['blah', 'lots  ', ' of ', ' spaces', 'here ']

Это не очень хорошо работает для вашей строки примера, но прекрасно работает для разделенного запятыми. Для вашей примерной строки вы можете комбинировать силу re.split для разделения на шаблоны регулярных выражений, чтобы получить эффект "split-on-this-or-that".

$ re.split('[, ]',string)
['blah',
 '',
 'lots',
 '',
 '',
 '',
 '',
 'of',
 '',
 '',
 '',
 'spaces',
 '',
 'here',
 '']

К сожалению, этот уродливый, но a filter сделает трюк:

$ filter(None, re.split('[, ]',string))
['blah', 'lots', 'of', 'spaces', 'here']

Voila!

Ответ 10

import re
mylist = [x for x in re.compile('\s*[,|\s+]\s*').split(string)

Просто, запятая или хотя бы одно пустое пространство с/без предшествующих/следующих пробелов.

Попробуйте!

Ответ 11

map(lambda s: s.strip(), mylist) будет немного лучше, чем явно зацикливание.
Или за все это сразу:

map(lambda s:s.strip(), string.split(','))

Это в основном все, что вам нужно.

Ответ 12

Удалите пустое пространство из строки, а затем разделите его.

mylist = my_string.replace('  ','.').replace('.','').replace(', ',',').replace(' ,',',').split(',')