Возьмите пробел / отступ строки с помощью Python

В принципе, если у меня есть строка текста, которая начинается с отступа, то какой способ захватить этот отступ и поместить его в переменную в Python? Например, если строка:

\t\tthis line has two tabs of indention 

Тогда он вернет '\ t \ t'. Или, если линия была:

  this line has four spaces of indention 

Тогда он вернет четыре пробела.

Поэтому, я думаю, вы могли бы сказать, что мне просто нужно отделить все от строки от первого символа без пробелов до конца. Мысли?

6 Solutions collect form web for “Возьмите пробел / отступ строки с помощью Python”

 import re s = "\t\tthis line has two tabs of indention" re.match(r"\s*", s).group() // "\t\t" s = " this line has four spaces of indention" re.match(r"\s*", s).group() // " " 

И чтобы разбить ведущие пробелы, используйте lstrip .


Поскольку есть пониженные голоса, которые, вероятно, подвергли сомнению эффективность регулярного выражения, я сделал некоторое профилирование, чтобы проверить эффективность каждого случая.

Очень длинная строка, очень короткое ведущее пространство

RegEx> Itertools >> lstrip

 >>> timeit.timeit('r.match(s).group()', 'import re;r=re.compile(r"\s*")s=" hello world!"*10000', number=100000) 0.10037684440612793 >>> timeit.timeit('"".join(itertools.takewhile(lambda x:x.isspace(),s))', 'import itertools;s=" hello world!"*10000', number=100000) 0.7092740535736084 >>> timeit.timeit('"".join(itertools.takewhile(str.isspace,s))', 'import itertools;s=" hello world!"*10000', number=100000) 0.51730513572692871 >>> timeit.timeit('s[:-len(s.lstrip())]', 's=" hello world!"*10000', number=100000) 2.6478431224822998 

Очень короткая строка, очень короткое ведущее пространство

lstrip> RegEx> Itertools

Если вы можете ограничить длину строки до тысяч символов или меньше, трюк lstrip может быть лучше.

 >>> timeit.timeit('r.match(s).group()', 'import re;r=re.compile(r"\s*");s=" hello world!"*100', number=100000) 0.099548101425170898 >>> timeit.timeit('"".join(itertools.takewhile(str.isspace,s))', 'import itertools;s=" hello world!"*100', number=100000) 0.53602385520935059 >>> timeit.timeit('s[:-len(s.lstrip())]', 's=" hello world!"*100', number=100000) 0.064291000366210938 

Это показывает, что трюк lstrip примерно равен O (√n), а методы RegEx и itertool – O (1), если количество ведущих пробелов не много.

Очень короткая строка, очень длинное ведущее пространство

lstrip >> RegEx >>> Itertools

Если есть много ведущих пробелов, не используйте RegEx.

 >>> timeit.timeit('s[:-len(s.lstrip())]', 's=" "*2000', number=10000) 0.047424077987670898 >>> timeit.timeit('r.match(s).group()', 'import re;r=re.compile(r"\s*");s=" "*2000', number=10000) 0.2433168888092041 >>> timeit.timeit('"".join(itertools.takewhile(str.isspace,s))', 'import itertools;s=" "*2000', number=10000) 3.9949162006378174 

Очень длинная строка, очень длинное ведущее пространство

lstrip >>> RegEx >>>>>>>> Itertools

 >>> timeit.timeit('s[:-len(s.lstrip())]', 's=" "*200000', number=10000) 4.2374031543731689 >>> timeit.timeit('r.match(s).group()', 'import re;r=re.compile(r"\s*");s=" "*200000', number=10000) 23.877214908599854 >>> timeit.timeit('"".join(itertools.takewhile(str.isspace,s))', 'import itertools;s=" "*200000', number=100)*100 415.72158336639404 

Это показывает, что все методы масштабируются примерно как O (m), если не-пространственная часть не много.

lstrip способ: злоупотреблять lstrip !

 fullstr = "\t\tthis line has two tabs of indentation" startwhites = fullstr[:len(fullstr)-len(fullstr.lstrip())] 

Таким образом, вам не нужно обрабатывать все детали пробелов!

(Спасибо Адаму за исправление)

Это также можно сделать с помощью str.isspace и itertools.takewhile вместо regex.

 import itertools tests=['\t\tthis line has two tabs of indention', ' this line has four spaces of indention'] def indention(astr): # Using itertools.takewhile is efficient -- the looping stops immediately after the first # non-space character. return ''.join(itertools.takewhile(str.isspace,astr)) for test_string in tests: print(indention(test_string)) 
 def whites(a): return a[0:a.find(a.strip())] 

В принципе, моя идея:

  1. Найдите полосу стартовой линии
  2. Найдите разницу между стартовой и разделенной

Если вы заинтересованы в использовании регулярных выражений, вы можете использовать это. /\s/ обычно соответствует одному символу пробела, поэтому /^\s+/ будет соответствовать пробелу, начинающему строку.

Как насчет использования regex \s* который соответствует любым символам пробела. Вам просто нужно пропустить пробел в начале строки, чтобы либо выполнить search с помощью регулярного выражения ^\s* либо просто match с \s* .

Python - лучший язык программирования в мире.