2012-11-05 103 views
3

我正在構建一系列字符串的分析器。 我需要檢查每行縮進多少(通過製表符或空格)。檢查字符串縮進?

每一行只是在文本編輯器的字符串。 如何檢查字符串縮進多少?

或者說,也許我可以檢查多少空格或\噸串之前,但我不確定如何。

+0

看看http://stackoverflow.com/questions/2378962/returning-the-lowest-index-for-the-first-non-whitespace-character-in-a-string-in –

+0

[什麼有你試過了嗎?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – jbowes

+0

你知道空間是如何表現的嗎?一個標籤?計算出現次數,你很好走,不是嗎? – XORcist

回答

10

要計算的空格數在字符串的開頭,你可以做剝離左(空格去掉)字符串和原始的比較:

a = " indented string" 
leading_spaces = len(a) - len(a.lstrip()) 
print(leading_spaces) 

然在解釋你:

>>> a = " indented string" 
>>> leading_spaces = len(a) - len(a.lstrip()) 
>>> print(leading_spaces) 
4 

標籤縮進是上下文特定的...它的變化,不管以何種程序是顯示製表符的設置。這種方法只會告訴您空白字符的總數(每個標籤將被視爲一個字符)。

或者證明:

>>> a = "\t\tindented string" 
>>> leading_spaces = len(a) - len(a.lstrip()) 
>>> print(leading_spaces) 
2 

編輯:

如果你想這樣做是爲了整個文件,你可能會想嘗試

with open("myfile.txt") as afile: 
    line_lengths = [len(line) - len(line.lstrip()) for line in afile] 
+0

這是我得到的解決方案,但後來我並不困惑如何告訴什麼是標籤,什麼是空間? –

+0

@DhruvGovil你是對的......這不會告訴你,如果它是一個選項卡或空間。如果你想知道有多少空間,我會用martineau提到的'line.expandtab(4)'將選項卡擴展到空格。這會告訴你絕對的空間數量。爲沒有文字的線條設置線條長度也是一個好主意。 – Gizmo

+0

太棒了。這真的很好。謝謝! –

7

我覺得小發明的基本想法是好的,並且通過使用字符串對象的expandtabs()方法來擴展它以處理前導製表符和空格的任何混合是相對容易的:

def indentation(s, tabsize=4): 
    sx = s.expandtabs(tabsize) 
    return 0 if sx.isspace() else len(sx) - len(sx.lstrip()) 

print indentation(" tindented string") 
print indentation("\t\tindented string") 
print indentation(" \t \tindented string") 

最後兩個print語句將輸出相同的值。

編輯:我修改它來檢查,如果遇到所有的標籤和空間的線返回0。

+0

謝謝,早先錯過了這個,但那個expandtabs肯定是方便的。 –