Как бы вы добавили комментарии к произвольному количеству строк? - PullRequest
0 голосов
/ 14 марта 2012

После ввода строки, такой как: '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, был в списке.

1 Ответ

3 голосов
/ 14 марта 2012

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

Возвращает самый низкий индекс в s, где найдена подстрока эта подпрограмма целиком содержится в s [start: end]. Вернуть -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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...