Возвращает самый низкий индекс для первого непробельного символа в строке в Python - PullRequest
11 голосов
/ 04 марта 2010

Какой самый короткий способ сделать это в Python?

string = "   xyz"

должен возвращать индекс = 3

Ответы [ 7 ]

34 голосов
/ 04 марта 2010
>>> s = "   xyz"
>>> len(s) - len(s.lstrip())
3
6 голосов
/ 04 марта 2010
>>> next(i for i, j in enumerate('   xyz') if j.strip())
3

или

>>> next(i for i, j in enumerate('   xyz') if j not in string.whitespace)
3

в версиях Python <2.5 вам придется сделать: </p>

(...).next()
2 голосов
/ 04 марта 2010

Похоже, что бригада "регулярные выражения может сделать все" взяла выходной, поэтому я буду заполнять:

>>> tests = [u'foo', u' foo', u'\xA0foo']
>>> import re
>>> for test in tests:
...     print len(re.match(r"\s*", test, re.UNICODE).group(0))
...
0
1
1
>>>

FWIW: затраченное время O (the_answer), а не O (len (input_string))

1 голос
/ 29 ноября 2012

Многие из предыдущих решений повторяются в нескольких точках в своих предлагаемых решениях.А некоторые делают копии данных (строки).re.match (), strip (), enumerate (), isspace () дублируются за работой сцены.

next(idx for idx, chr in enumerate(string) if not chr.isspace())
next(idx for idx, chr in enumerate(string) if not chr.whitespace)

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

Однако, если в вашей строке используются только пробельные символы илиСимволы табуляции, а затем следующее, более простое, понятное и быстрое решение также использует меньше памяти.

def get_indent(astr):

    """Return index of first non-space character of a sequence else False."""

    try:
        iter(astr)
    except:
        raise

    # OR for not raising exceptions at all
    # if hasattr(astr,'__getitem__): return False

    idx = 0
    while idx < len(astr) and astr[idx] == ' ':
        idx += 1
    if astr[0] <> ' ':
        return False
    return idx

Хотя это может быть не самым быстрым или простым визуально, некоторые преимущества этого решения заключаются в том, что вы можетелегко перенести это на другие языки и версии Python.И, вероятно, легче всего отлаживать, так как мало магического поведения.Если вы поместите ядро ​​функции в строку с вашим кодом, а не в функцию, вы удалите часть вызова функции и сделаете это решение похожим в байт-коде на другие решения.

Дополнительно это решениепозволяет больше вариаций.Например, добавление теста для вкладок

or astr[idx] == '\t':

Или вы можете проверить все данные как итеративные один раз вместо проверки, является ли каждая строка итеративной.Помните, что такие вещи, как "" [0] вызывает исключение, тогда как "" [0:] нет.

Если вы хотите подтолкнуть решение к действию, вы можете пойти по непифоническому маршруту:

i = 0
while i < len(s) and s[i] == ' ': i += 1

print i
3

..

1 голос
/ 04 марта 2010
import re
def prefix_length(s):
   m = re.match('(\s+)', s)
   if m:
      return len(m.group(0))
   return 0
0 голосов
/ 04 марта 2010
>>> string = "   xyz"
>>> map(str.isspace,string).index(False)
3
0 голосов
/ 04 марта 2010
>>> string = "   xyz"
>>> next(idx for idx, chr in enumerate(string) if not chr.isspace())
3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...