2010-07-12 2 views
0

У меня есть строка следующим образомУдаление первой части каскадного строки с Python

 
CompilationStatistics_Compilation_StepList_Map_TimingUsage_ClockList_Clock_MinimumPeriod 

Что было бы самым простым способом, чтобы удалить первую часть (CompilationStatistics_) или последнюю часть (_MiniumuPeriod)?

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

m = re.search("{.+}_{.+}", string) 
m.group(2) 

ответ

2

Все, кроме первого:

s[s.find('_') + 1:] 

Все, кроме последней:

s[0:s.rfind('_')] 

Без либо:

s[s.find('_') + 1:s.rfind('_')] 

find возвращает первый индекс строки , и rfind возвращает последнее. Затем мы просто используем синтаксис среза.

+1

Действительно не согласиться, что это лучший ответ. Вопрос не имеет никакого отношения к нахождению индекса символов подчеркивания, поэтому поиск и нарезка на них - совершенно ненужный шаг. –

+0

@ Jesse, я мог бы легко сказать, что вопрос не имеет ничего общего с разделением, а создание двух промежуточных списков - ненужный шаг. Мой код короче, быстрее (с использованием 'timeit'), и, на мой взгляд, яснее. –

+0

Ну, я думаю, именно поэтому у нас есть голосование, чтобы решить эти субъективные вопросы. –

1

Если вы знаете размер фрагментов, которые вы хотите вырезать, вы можете использовать в Python string slicing, как это:

s="CompilationStatistics_Compilation_StepList_Map_TimingUsage_ClockList_Clock_MinimumPeriod" 
print s[22:-14] 

Конечно, есть и другие способы вы можете найти номер, необходимо, например, использовать String.rindex(), чтобы найти место, где начинается фрагмент конца, который вы хотите отключить. Например:

print s[len("CompilationStatistics_"):s.rindex("_MinimumPeriod")] 
3

Смотрите документацию Python для String methods, в частности partition и rpartition:

s = "CompilationStatistics_Compilation_StepList_Map_TimingUsage_ClockList_Clock_MinimumPeriod" 
print s.partition('_')[2].rpartition('_')[0] 

Результат

Compilation_StepList_Map_TimingUsage_ClockList_Clock 
+0

Требуется Python> = 2.5, но это лучший ответ, если вы в порядке с этим. – zwol

+0

Ваш ответ является самым правильным в отношении угловых случаев (см. Мой комментарий в ответе Мэтью Флашена), но аргументация в ваших комментариях была не очень надежной, мне жаль говорить :) – tzot

+0

Я думал, что ответ Мэтью Иселин был самым точно, поскольку проблема, которую я прочитал, на самом деле заключается в том, что «у меня есть куча слов, соединенных с подчеркиваниями, и я хочу всех, кроме первого и последнего из них», и его улавливает это элегантно. Другие, возможно, разобрали проблему по-разному, но я согласен с тем, что рассуждаю на другом ответе: 'find()' -ing и добавление 1 к индексу до нарезки на нем - это решение, которое, если бы оно было отправлено где угодно, когда-либо работал бы, был бы переписан. –

3

'_'.join(s.split("_")[1:-1])?

Изменение номеров сплайсов изменит, сколько вы получите: удаление «-1» приведет только к удалению первого элемента, например.

0

Удаление первой части тривиальным вниз с расколом():

s.split("_", 1)[1] # Take the second part of the string, split into 2 pieces. 
+1

Именно поэтому были созданы методы '.partition' и' .rpartition'. – tzot

+0

Вау, я узнал что-то новое, спасибо, @ ΤΖΩΤΖΙΟΥ. – Oddthinking

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