如何在字符串中查找前导序列的长度?

时间:2015-04-12 06:32:40

标签: python string

我想计算一个字符串中前导空格的数量。这是最恐怖的方式吗?

>>>F(' ' * 5 + 'a')
5

(更新)以下是几个答案的时间安排:

import timeit
>>> timeit.timeit("s.index(re.search(r'\S',s).group())", number=10000, setup="import re;s='     a'")
0.027384042739868164
>>> timeit.timeit("len([i for i in itertools.takewhile(str.isspace,s)])", number=10000, setup="import itertools;s='     a'")
0.025166034698486328
>>> timeit.timeit("next(idx for idx,val in enumerate(s) if val != ' ')", number=10000, setup="s='     a'")
0.028306961059570312
>>> timeit.timeit("F('     a')", number=10000, setup="def F(s): return len(s)-len(s.lstrip(' '))")
0.0051808357238769531

10 个答案:

答案 0 :(得分:7)

使用re module

>>> s
'     a'
>>> import re
>>> s.index(re.search(r'\S',s).group())
5

使用itertools

>>> import itertools
>>> len([i for i in itertools.takewhile(str.isspace,s)])
5

蛮力方式

>>> def F(s):
...     for i in s:
...          if i!=' ':
...               return s.index(i)
... 
>>> F(s)
5

答案 1 :(得分:4)

>>> F = lambda x:len(x)-len(x.lstrip(' '))
>>> F(' ' * 5 + 'a')
5

如果您需要查找前导空格的长度,则可以删除' '来自lstrip,现在仅限于空格

答案 2 :(得分:3)

使用enumerate遍历字符串s。只要您点击' '中的非s项目,就打印该索引,这就是您要查找的内容。

>>> for i, val in enumerate(s):
...    if val != ' ':  
...       print i  
...       break
...
5

答案 3 :(得分:2)

def f(string):
    try:
        return [c == ' ' for c in string].index(False)
    except ValueError:
        return -1

查找与' '

不匹配的第一个字符

答案 4 :(得分:1)

通过re模块。并使用len函数。

>>> s = '     a'
>>> len(re.sub(r'\S.*', '',s))
5

这将从第一个非空格字符中删除所有字符到最后一个字符。然后len函数应用于结果字符串,为您提供前导空格的长度。

>>> s = '     a'
>>> len(re.match(r'\s*', s).group())
5
>>> s = 'a'
>>> len(re.match(r'\s*', s).group())
0

这将只匹配零个或多个前导空格。

使用re.match函数的end()属性。

>>> s = '     a'
>>> re.match(r'\s*', s).end()
5
>>> re.match(r'\s*', 'd').end()
0

Thanks to Adam

答案 5 :(得分:1)

哦,还有一个人还没有发布。

def leading_spaces(s):
    return next(idx for idx,val in enumerate(s) if val != " ")

这几乎可以肯定是最快的方法

答案 6 :(得分:0)

一张简单的地图然后总结:

>>> sum(map(bool, takewhile(str.isspace, '    a  ')))
4

答案 7 :(得分:0)

代码:

>>> i = 0
>>> while i < len(s):
...     if s[i] != ' ':
...       print i
...       break  
...     i += 1

5

答案 8 :(得分:0)

使用第一个字符删除左侧的字符串:

>>> s = 'aaaaabaca'
>>> len(s) - len(s.lstrip(s[0]))
5

如果你想使它适用于空字符串,只需添加一个支票:

>>> s = ''
>>> len(s) - len(s.lstrip(s[0])) if s else 0
0

答案 9 :(得分:-2)

抱歉没有足够明确....初始化一个计数器...你只是遍历字符串并设置一个条件来检查列表中的每个变量是否为空格,计数器增加1 ...

counter = 0

sstring = " " * 5 + "a"

for x in sstring:

    if x == " ":
        counter += 1
    else:
        continue

print(counter)

我真诚地抱歉,我不知道为什么我的剧本一直以这种糟糕的形式出现......我是新来的