返回Python中字符串中第一个非空白字符的最低索引

时间:2010-03-04 11:47:01

标签: python string string-matching

在Python中执行此操作的最短方法是什么?

string = "   xyz"

必须返回index = 3

7 个答案:

答案 0 :(得分:32)

>>> s = "   xyz"
>>> len(s) - len(s.lstrip())
3

答案 1 :(得分:6)

>>> 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你必须这样做:

(...).next()

答案 2 :(得分:2)

看起来“正则表达式可以做任何事情”旅已经休息了一天,所以我会填写:

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

答案 3 :(得分:1)

import re
def prefix_length(s):
   m = re.match('(\s+)', s)
   if m:
      return len(m.group(0))
   return 0

答案 4 :(得分:1)

以前的许多解决方案都在他们提出的解决方案中的几个点上进行迭代。有些人会复制数据(字符串)。 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:]不引用异常。

如果你想将解决方案推向内联,你可以采用非Pythonic路线:

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

print i
3

答案 5 :(得分:-1)

>>> string = "   xyz"
>>> next(idx for idx, chr in enumerate(string) if not chr.isspace())
3

答案 6 :(得分:-1)

>>> string = "   xyz"
>>> map(str.isspace,string).index(False)
3