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 |
使用
1 2 3 4 5 | >>> s ' a' >>> import re >>> s.index(re.search(r'\S',s).group()) 5 |
使用
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中删除'',现在仅限于空格
使用
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 !="") |
这几乎可以肯定是最快的方法
通过
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函数的
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) |
我真诚地抱歉,我不知道为什么我的剧本一直以这种糟糕的形式出现......我在这里有点新鲜