2009-07-14 2 views
2

Это очень новичок вопрос, и я, вероятно, получить downvoted для него, но я, честно говоря, не смог найти ответ после по крайней мере час поиска в Google. Я научился разбивать строки на основе «точных местоположений», где вам нужно точно знать, где заканчивается это слово. Но я не нашел статьи, которые объясняли, как это сделать на «нестатических» строках, которые могут измениться.Нужна помощь с python string/slicing operations

Кроме того, я не хочу использовать string.split() в этом случае, поскольку это немного переборщик для того, что мне нужно.

Я в принципе есть строка, как это:

myString = "!save python Python is a high-level object oriented language created by Guido van Rossum." 
# the format is !save [singleword] [definition] 

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

Мне нужно сохранить переменную title (python в этом случае) и определение этой строки. Somethig как:

title = myString[1] 
definition = myString[everything after string[1] 

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

Буду признателен за то, какие функции/методы следует читать, чтобы архивировать это. Заранее спасибо.

ответ

12

Почему раскол Overkill?

verb, title, definition = myString.split (' ', 2) 
+0

Это повлияет на третью часть его строки, в которой есть несколько пробелов? – mandroid

+2

Нет, второй параметр для split указывает максимальное количество раз, чтобы разделить строку. После первых 2 остальная часть строки возвращается. –

+1

@mandroid Второй параметр сообщает, сколько разделителей выполнить. В этом случае он прекратит расщепление после того, как оно попадет на второе вхождение разделителя. http://docs.python.org/library/stdtypes.html#str.split Если у вас есть сомнения, взломайте оболочку и попробуйте. –

2

Если у вас есть пробелы между вашей команды, названия и определение вы можете:

wordList = myString.split() 
cmd = wordList[0] # !save 
title = wordList[1] # python 
definition = ' '.join(wordList[2:]) # Python is a high-level object oriented language created by Guido van Rossum. 

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

import re 
m = re.match('(/S+)/s*(/S+)/s*(.*)') 
cmd = m.group(1) 
title = m.group(2) 
definition = m.group(3) 
+0

это отличный ответ! Спасибо большое! я определенно буду использовать некоторые из ваших предложений! благодаря! – 2009-07-14 22:42:23

+8

Ах, вы не хотите использовать пилу. Вот вместо этого бензопила! –

+0

Обратите внимание, что myString.split() выполняет нормализацию пробелов, поэтому после этого соединение() снова не возвращает вас к исходному «определению». –

2

Выбранный ответ (после PEP8ing):

verb, title, definition = my_string.split(' ', 2) 

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

verb, title, definition = my_string.split(None, 2) 

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

definition = ' '.join(definition.split()) 
+1

+1 для добавления нескольких пробельных символов/прогонов – mhawke

+1

@mhawke: Я думаю, что normali [sz] e_whitespace() был бы хорошим кандидатом для метода str ... команда join/split caper очень неэффективна, особенно если никаких изменений необходимо; встроенный может просто вернуть ссылку на исходную строку в этом случае. Одна досадная вещь о соединении/расколе состоит в том, что \ xA0 aka   не считается пробелом в (по умолчанию) C-locale в Python 2.x. –

+0

Вообще говоря, мне нравятся ваши рекомендации, но я принял его спецификацию буквально: # format is save [singleword] [definition] –

Смежные вопросы