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

How to find the length of a leading sequence in a string?

我想计算字符串中前导空格的数量。这样做的最Pythonic方法是什么?

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

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

1
2
3
4
5
6
7
8
9
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


使用re模块

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

使用itertools

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

蛮力的方式

1
2
3
4
5
6
7
>>> def F(s):
...     for i in s:
...          if i!=' ':
...               return s.index(i)
...
>>> F(s)
5

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

如果你需要找到前导空格的长度,你可以从lstrip中删除'',现在仅限于空格


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

1
2
3
4
5
6
>>> for i, val in enumerate(s):
...    if val != ' ':  
...       print i  
...       break
...
5

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

查找与' '不匹配的第一个字符


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

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

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


通过re模块。并使用len功能。

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

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

要么

1
2
3
4
5
6
>>> s = '     a'
>>> len(re.match(r'\s*', s).group())
5
>>> s = 'a'
>>> len(re.match(r'\s*', s).group())
0

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

要么

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

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

感谢Adam


使用第一个字符剥去左侧的字符串:

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

如果要使其适用于空字符串,只需添加一个检查:

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

码:

1
2
3
4
5
6
7
8
>>> i = 0
>>> while i < len(s):
...     if s[i] != ' ':
...       print i
...       break  
...     i += 1

5


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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
counter = 0

sstring ="" * 5 +"a"

for x in sstring:

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

print(counter)

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