计算字符串中前导空格的pythonic方法是什么?

时间:2012-11-30 16:09:52

标签: python

我知道我可以用这个来计算字符串中的前导空格:

>>> a = "   foo bar baz qua   \n"
>>> print "Leading spaces", len(a) - len(a.lstrip())
Leading spaces 3
>>>

但是有更多的pythonic方式吗?

7 个答案:

答案 0 :(得分:61)

你的方式是pythonic但不正确,它也会计算其他空格字符,只计算空格是明确的a.lstrip(' ')

a = "   \r\t\n\tfoo bar baz qua   \n"
print "Leading spaces", len(a) - len(a.lstrip())
>>> Leading spaces 7
print "Leading spaces", len(a) - len(a.lstrip(' '))
>>> Leading spaces 3

答案 1 :(得分:19)

您可以使用itertools.takewhile

sum( 1 for _ in itertools.takewhile(str.isspace,a) )

并证明它提供与您的代码相同的结果:

>>> import itertools
>>> a = "    leading spaces"
>>> print sum( 1 for _ in itertools.takewhile(str.isspace,a) )
4
>>> print "Leading spaces", len(a) - len(a.lstrip())
Leading spaces 4

我不确定此代码是否实际上比原始解决方案更好。它的优点是它不会创建更多的临时字符串,但这非常小(除非字符串非常大)。我没有发现任何一个版本都能立即明确该代码行,所以如果你打算多次使用它,我肯定会把它包装在一个很好的命名函数中(在任何一种情况下都有适当的注释)。

答案 2 :(得分:9)

只是为了变化,理论上你可以使用正则表达式。它有点短,看起来比对len()的双重调用更好。

>>> import re
>>> a = "   foo bar baz qua   \n"
>>> re.search('\S', a).start() # index of the first non-whitespace char
3

或者:

>>> re.search('[^ ]', a).start() # index of the first non-space char
3

但我不推荐这个;根据我做的快速测试,它的效率远低于len(a)-len(lstrip(a))

答案 3 :(得分:2)

看起来......对我很好。通常我会回答“是X Pythonic吗?”有一些功能性魔法的问题,但我觉得这种方法不适合字符串操作。

如果有一个内置的只有返回前导空格,并且取len()那个,我会说它去 - 但是AFAIK没有,re和其他解决方案绝对有点过分。

答案 4 :(得分:1)

使用nextenumerate

next((i for i, c in enumerate(a) if c != ' '), len(a))

对于任何空白:

next((i for i, c in enumerate(a) if not c.isspace()), len(a))

答案 5 :(得分:1)

您可以使用正则表达式:

def count_leading_space(s): 
    match = re.search(r"^\s*", s) 
    return 0 if not match else match.end()

In [17]: count_leading_space("    asd fjk gl")                                  
Out[17]: 4

In [18]: count_leading_space(" asd fjk gl")                                     
Out[18]: 1

In [19]: count_leading_space("asd fjk gl")                                      
Out[19]: 0

答案 6 :(得分:0)

我最近有一个类似的计数缩进任务,因为我想将制表符计数为四个空格:

def indent(string: str):
return sum(4 if char is '\t' else 1 for char in string[:-len(string.lstrip())])