Подтвердить что ты не робот

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

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

\t\tthis line has two tabs of indention

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

    this line has four spaces of indention

Затем он вернет четыре пробела.

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

4b9b3361

Ответ 1

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), если не пространственная часть не много.

Ответ 2

Проницательный способ: злоупотребление lstrip!

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

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

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

Ответ 3

Это также можно сделать с помощью str.isspace и itertools.takewhile вместо регулярного выражения.

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))

Ответ 4

def whites(a):
return a[0:a.find(a.strip())]

В принципе, моя идея такова:

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

Ответ 5

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

Ответ 6

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