Разделить запятыми и разделять пробелами в Python
у меня есть код python, который разбивается на запятую, но не удаляет пробелы:
>>> string = "blah, lots , of , spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots ', ' of ', ' spaces', ' here ']
Я бы предпочел в конечном итоге с пробелами удалены следующим образом:
['blah', 'lots', 'of', 'spaces', 'here']
Я знаю, что я мог бы перебирать список и разделять() каждый элемент, но, поскольку это Python, я предполагаю, что есть более быстрый, простой и элегантный способ сделать это.
11 ответов:
использовать список понимание -- проще, и так же легко читать как
forпетли.my_string = "blah, lots , of , spaces, here " [x.strip() for x in my_string.split(',')]посмотреть:Python docs on List Comprehension
хорошее 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']смотрите ведущие пробелы в бла?
уточнение: выше используется интерпретатор Python 3, но результаты одинаковы в Python 2.
Я знаю, что на это уже ответили, но если вы закончите делать это много, регулярные выражения могут быть лучшим способом пойти:
>>> import re >>> re.sub(r'\s', '', string).split(',') ['blah', 'lots', 'of', 'spaces', 'here']The
\sсоответствует любому символу пробела, и мы просто заменяем его пустой строкой''. Вы можете найти дополнительную информацию здесь:http://docs.python.org/library/re.html#re.sub
Я пришел добавить:
map(str.strip, string.split(','))но видел, как это уже было упомянуто Джейсон Orendorff в комментарий.
читая комментарий Гленна Мейнарда в том же ответе, предлагающем понимание списка по карте, я начал задаваться вопросом, почему. Я предположил, что он имел в виду из соображений производительности, но, конечно, он мог иметь в виду стилистические причины или что-то еще (Гленн?).
так быстро (возможно, ущербные?) тест на моей коробке применяя три методы в цикле выявлены:
[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
просто удалить пробелы из строки, прежде чем разделить его.
mylist = my_string.replace(' ','').split(',')
re(как в регулярных выражениях) позволяет разделить на несколько символов сразу:$ string = "blah, lots , of , spaces, here " $ re.split(', ',string) ['blah', 'lots ', ' of ', ' spaces', 'here ']Это не очень хорошо работает для вашего примера строки, но прекрасно работает для списка, разделенного запятыми. Для примера строки, вы можете объединить re.разделить мощность, чтобы разделить на регулярные выражения чтобы получить эффект" Сплит-на-том-то".
$ re.split('[, ]',string) ['blah', '', 'lots', '', '', '', '', 'of', '', '', '', 'spaces', '', 'here', '']к сожалению, это некрасиво, но
filterбудет делать трюк:$ filter(None, re.split('[, ]',string)) ['blah', 'lots', 'of', 'spaces', 'here']вуаля!
map(lambda s: s.strip(), mylist)было бы немного лучше, чем явно цикл. Или за все сразу:map(lambda s:s.strip(), string.split(','))
import re mylist = [x for x in re.compile('\s*[,|\s+]\s*').split(string)просто запятая или хотя бы один пробел с/без предшествующих/последующих пробелов.
пожалуйста, попробуйте!
map(lambda s: s.strip(), mylist)было бы немного лучше, чем явно цикл.
Или за все сразу:map(lambda s:s.strip(), string.split(','))это в основном все, что вам нужно.
Comments