2012-03-14 63 views
0

輸入一個字符串,如後:'3,11,15,16,35'
如果你想每個數字代表行號的一些代碼,
添加到這些行註釋的目的, 你會怎麼辦?如何將評論添加到任意數量的行?

更具體地說,在一個for循環,你遍歷每一行代碼,你會如何檢查字符串,看它是否包含當前的行號。 這裏是有相關部門的我的嘗試:

self.num = input('Line(s) to number?') 
self.linelist = self.code.splitlines() 

for i, element in enumerate(self.linelist): 
    self.count += 1 
    # if match(str(self.count) + r",", self.num): 
    if self.num.find(str(self.count) + ','): 
     self.final = self.final + element + ' # line ' + str(self.count) + '\n' 
    else: 
     self.final = self.final + element + '\n' 

re.match嘗試只會評論字符串中的第一個行號。
find嘗試似乎與第一個匹配,
註釋除與該號碼關聯的行之外的所有內容。
的另一個問題與此設置是1,可以發現,如果11,是在列表中。

+0

我試圖簡化它;但我問了太多事情,而阿瓦里斯熟練地回答了所有這些問題。 – 2013-02-20 06:18:08

回答

3

問題是,您是直接使用的find結果在if聲明。只要看看什麼find回報:

返回最低指數S其中的子子找到這樣 該子被完全包含在S [開始:結束。失敗時返回-1。 默認爲開始和結束和負值的解釋是 一樣的切片。

所以,你會得到一個integer對應的第一場比賽或-1的索引。當你做if an_integer:時,它實際上是在做if bool(an_integer):bool(an_integer)Falsean_integer==0True的一切。這意味着你會做else的一部分,如果你的行號的輸入和if部分爲一切的開端找到。你需要做的是這樣:

if self.num.find(str(self.count) + ',') >= 0: 

表示匹配。

至於re.match部分,re.match嘗試匹配從字符串開始的子字符串。您應該改用re.search

這就是說,即使有了這些修復程序,甚至使用分隔符,您仍然會遇到您確定的不匹配問題。 11,將匹配1,11,。要解決這個問題,可以用分隔符分隔輸入並獲取值列表。然後,你可以檢查是否值是在該列表:

self.num = input('Line(s) to number?').split(",") 
# ... 
    if str(self.count) in self.num: 
    #... 

作爲一個小側面說明,你已經在使用enumerate獲得的行號。這應該消除使用計數器(即self.count)。如果你希望他們從1開始,你可以告訴enumerate通過提供可選的第二個參數可以這樣做:

for i, element in enumerate(self.list, 1): 

然後,使用i代替self.count

+0

我很感謝你的徹底解答!現在一切都很清楚。 – 2012-03-14 03:38:22