строка комментария не экранируется, если она находится в том же строковом коде из моего файла input.txt с python - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть строки, содержащие комментарии, помеченные // в моем input.txt файле:

Входной файл

something
something // something something
// something something
something

Здесь строка 3 пропускается,но строка 2 - нет.

Мой код

for line in (l for l in open('input.txt', mode='r') if not l.lstrip().startswith('//')):
    f_write.write(line)

Тот же код, переписанный как функция многократного использования:

def skip_comments(file):
    for line in file:
        if not line.lstrip().startswith('//'):
            yield line

f = open('input.txt')
for line in skip_comments(f):
    f_write.write(line)

Оба фрагмента кода даюттот же результат.Я много раз пытался открыть с другим режимом и строкой, но без lstrip, это не работает.

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

str.startswith точно проверяет, что подразумевается под ее именем: начинается ли строка с запрошенного префикса.Никакое количество зачистки начальных пробелов с lstrip не будет магическим образом представлять комментарии, начинающиеся в середине строки.

Лучшим вариантом будет str.find, который возвращает индекс комментария к строке.

def skip_comments(file):
    for line in file:
        index = line.find('//')
        if index >= 0:
            yield line[:index]
        else:
            yield line
0 голосов
/ 20 февраля 2019

вы можете проверить, если // в вашей строке и просто сохранить текст, который появляется до //

for line in (l.split('//')[0].strip() for l in open('input.txt', mode='r') if l.split('//')[0].strip()):
        f_write.write(line)
0 голосов
/ 20 февраля 2019

Вы должны написать свой код следующим образом:

def skip_comments(file):
for line in file:
    if not line.lstrip().startswith('//'):
        line = line.split("//")
        yield line[0]

update

, если вы хотите проверить более сложный комментарий, я предлагаю код ниже:

def skip_comments(file):
for line in file:
    if line.startswith('//'):
        continue
    elif line.find("/*")>=0:
        startIndex = line.find("/*")
        endIndex = line.find("*/")
        line = line[:startIndex] + line[endIndex + len("*/"):]
        yield line
    else
        line = line.split("//")[0]
        yield line

и вы можете поместить среднюю часть в то время как это, так что он удаляет все комментарии в строке:

def skip_comments(file):
for line in file:
    if line.startswith('//'):
        continue
    elif line.find("/*")>=0:
        while(line.find("/*")>=0):
            startIndex = line.find("/*")
            endIndex = line.find("*/")
            line = line[:startIndex] + line[endIndex + len("*/"):]
        yield line
    else
        line = line.split("//")[0]
        yield line
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...