2012-03-14 2 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

Я попытался упростить его; но я спросил слишком много вещей, и Аварис умело ответил на все. –

ответ

3

Проблема заключается в том, что вы используете результат find непосредственно в заявлении if. Просто посмотрите на то, find возвращений:

Возврат самый низкий показатель в секундах, где подстрока югу встречается такая , что к югу целиком содержится в с [начало: конец]. Возврат -1 при ошибке. По умолчанию для начала и конца и интерпретации отрицательных значений так же, как для срезов.

Таким образом, вы будете получать integer соответствующий индекс первого матча или -1. Когда вы делаете if an_integer:, это фактически делает if bool(an_integer):. bool(an_integer) - False для an_integer==0 и True для всего остального. Это означает, что вы будете делать 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

Я ценю ваш тщательный ответ! Теперь все ясно. –

Смежные вопросы