2016-03-27 3 views
4

Есть ли какой-либо простой способ в Python, чтобы удалить строку и получить начальный индекс и конечный индекс?Удаление строки и индекса начала и конца начала

Пример: Учитывая строку ' hello world! ', я хочу раздели строку 'hello world!' А также индекс начальной 2 и и указательным 14.

' hello world! '.strip() возвращает только отрезанную строку.

Я мог бы написать функцию:

def strip(str): 
    ''' 
    Take a string as input. 
    Return the stripped string as well as the start index and end index. 
    Example: ' hello world! ' --> ('hello world!', 2, 14) 
    The function isn't computationally efficient as it does more than one pass on the string. 
    ''' 
    str_stripped = str.strip() 
    index_start = str.find(str_stripped) 
    index_end = index_start + len(str_stripped) 
    return str_stripped, index_start, index_end 

def main(): 
    str = ' hello world! ' 
    str_stripped, index_start, index_end = strip(str) 
    print('index_start: {0}\tindex_end: {1}'.format(index_start, index_end)) 

if __name__ == "__main__": 
    main() 

, но мне интересно, предоставляет ли Python или одна популярной библиотеки любого встроенного способа сделать это.

+1

Я не думаю, что есть встроенный способ. Ваш код очень краткий, на самом деле это всего лишь три строки 'str_stripped = str.strip()', 'index_start = str.find (str_stripped)' и 'index_end = index_start + len (str_stripped)'. Все остальное излишне. –

+1

@ LukeTaylor: Это краткий, но, как говорится в комментариях, он делает больше одного прохода по строке. Конечно, вы можете закодировать функцию 'strip()', которая возвращает желаемый результат, делая только один проход. –

ответ

6

Один из вариантов (не самый прямолинейный) будет делать это с регулярными выражениями:

>>> import re 
>>> s = ' hello world! ' 
>>> match = re.search(r"^\s*(\S.*?)\s*$", s) 
>>> match.group(1), match.start(1), match.end(1) 
('hello world!', 2, 14) 

где в ^\s*(\S.*?)\s*$ схеме:

  • ^ это начало строки
  • \s* ноль или более знаков пробега
  • (\S.*?) - группа захвата, которая захват без пробела следуют любые символы любое количество раз в non-greedy моды
  • $ является концом строки
+2

Это не будет работать, если нет пробелов, которые нужно удалить. Использование '' \ s * ''вместо этого должно помочь – schwobaseggl

+0

@schwobaseggl ah, хорошо, позвольте мне исправить это. – alecxe

+0

Собирался публиковать что-то похожее, похоже, это самый быстрый способ для тестов, которые я сделал, но только если вы сначала скомпилируете, это немного медленнее, чем собственный код OP –

3

Наиболее эффективный способ сделать это путем вызова lstrip и rstrip отдельно , Например:

s = ' hello world! ' 
s2 = s.lstrip() 
s3 = s2.rstrip() 
ix = len(s) - len(s2) 
ix2 = len(s3) + ix 

Это дает:

>>> s3 
'hello world!' 
>>> ix 
2 
>>> ix2 
14 
>>> 
0

На самом деле у вас есть необходимые методы для выполнения этой задачи. strip, find и len - это все, что вам нужно.

s = ' hello world! ' 
s1 = s.strip() 
first_index = s.find(s1) 
end_index = first_index + len(s1) - 1