2015-04-29 2 views
3

Есть ли существующая функция в Python, которая работает как .strip()/.lstrip()/.rstrip(), но вместо этого возвращает разделенные пробелы, а не результирующую разделенную строку?Функция для возврата разделенных пробелов строки

А именно:

test_str = '\n\ttext goes here' 
test_str.lstrip() # yields 'text goes here' 
test_str.lwhite() # yields '\n\t' 

Где .white(), .lwhite() и .rwhite() являются функции, которые я надеюсь, что существует. В противном случае мне придется делать с регулярных выражений и захваченных групп:

^(\s*).*(\s*)$ for .white() 
^(\s*)   for .lwhite() 
(\s*)$   for .rwhite() 

Чтобы дать лучший пример, Python имеет .strip() методы, устраняющие пробелы в начале и в конце данной строки и возвращают зачищенный строку. То же самое с методами Python .lstrip() и .rstrip() только для начала и конца соответственно.

Я ищу способ вернуть пробелы, которые были удалены с концов строки. Таким образом, для строки, как следующее ...

sample = '\n\t this string\t is \n \ta sample\t!\n' 

... Я хочу '\n\t ' вернулся к начинающей версии, '\n' возвращается для концовки версии, или оба в списке возвращается для полной версии.

Спасибо всем!

+1

Вы нормально с используя itertools? o.0 или это ересь? – Shashank

+0

@Shashank: dropwhile и takewhile достаточно просты, чтобы закодировать их сами, даже если он говорит «нет». :) – abarnert

+0

@Shashank Первоначальная цель состояла в том, чтобы добиться этого, импортировав как можно меньше модулей, но в этот момент я полагаю, что это будет больше проблем, поскольку это уже стоит, если уже есть функция, которая делает это. Однако вы интересовались моим интересом к itertools. Как это сделать с этим модулем? – lostguru

ответ

1

К сожалению, я просто понял, что ты имел в виду полосу вместо раскола, так вот itertools.takewhile решение:

from itertools import takewhile 

def lstripped(s): 
    return ''.join(takewhile(str.isspace, s)) 

def rstripped(s): 
    return ''.join(reversed(tuple(takewhile(str.isspace, reversed(s))))) 

def stripped(s): 
    return lstripped(s), rstripped(s) 

polyfill для itertools.takewhile является следующее:

def takewhile(predicate, iterable): 
    # takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4 
    for x in iterable: 
     if predicate(x): 
      yield x 
     else: 
      break 
+0

Это на самом деле действительно изящный! Я определенно буду держать это в затылке, так как я не уверен, что я буду использовать на этом этапе. Насколько вы думаете, что это по сравнению с решением регулярного выражения? – lostguru

+0

@lostguru Временная сложность - это примерно так же эффективно, как и может быть, так как и то, и другое, и наоборот - быстрые итераторы, которые останавливают ASAP вместо обработки всей строки. Таким образом, он имеет в основном такую ​​же сложность по времени, как и не-жадное решение 're.search', которое останавливается, как только находит совпадение. Но временная сложность - это не то же самое, что производительность ... 're' - это зверь модуля, который оптимизирован для работы только с строками, в то время как itertools должен иметь возможность обрабатывать всевозможные итерации. Вероятно, вы увидите лучшую производительность от 're', но я бы поставил ее под сомнение. – Shashank

+0

Получил это, определенно приятно знать. Завтра я сделаю этот снимок, когда я нахожусь на рабочем компьютере. Большое спасибо! – lostguru

1

Я, вероятно, воспринимаю ваши слова буквально, но если вы хотите получить только пробелы в своей строке, то не понимаете ли вы способ?

In [112]: x 
Out[112]: '\n\ttext goes here' 

In [113]: ''.join([i for i in x if not i.isalnum()]).replace(" ",'') 
Out[113]: '\n\t' 
+0

Закрыть haha, для цели нужно просто вернуть '' \ n \ t'', а не '' \ n \ t ''. – lostguru

+0

Обновлено. Кажется, это делает работу. :) – fixxxer

+0

Плохой пример с моей стороны, извините. У Python есть методы .strip() ', которые удаляют пробелы в начале и в конце данной строки и возвращают лишенную строку. То же самое с методами Python '.lstrip()' и '.rstrip()' только для начала и конца соответственно. Я искал способ вернуть пробелы, которые были удалены с концов строки. Итак, для строки типа 'sample = '\ n \ t эта строка \ t является \ n \ ta sample \ t! \ N'' Я хочу, чтобы' '\ n \ t'' возвращался для начальной версии, '' \ n'' возвращается для окончательной версии, или оба в списке, возвращенном для полной версии. – lostguru