Как пропустить строку документации с помощью регулярных выражений - PullRequest
1 голос
/ 01 октября 2008

Я пытаюсь вставить несколько строк импорта в исходный файл python, но в идеале я бы хотел разместить их сразу после начальной строки документации. Допустим, я загружаю файл в переменную lines следующим образом:

lines = open('filename.py').readlines()

Как найти номер строки, где заканчивается строка документа?

Ответы [ 3 ]

9 голосов
/ 01 октября 2008

Вместо того, чтобы использовать регулярное выражение или полагаться на определенное форматирование, вы можете использовать модуль токена python.

import tokenize
f=open(filename)
insert_index = None
for tok, text, (srow, scol), (erow,ecol), l in tokenize.generate_tokens(f.readline):
    if tok == tokenize.COMMENT:
        continue
    elif tok == tokenize.STRING:
        insert_index = erow, ecol
        break
    else:
        break # No docstring found

Таким образом, вы можете справиться даже с такими патологическими случаями, как:

# Comment
# """Not the real docstring"""
' this is the module\'s \
docstring, containing:\
""" and having code on the same line following it:'; this_is_code=42

Точно так же, как Python будет обрабатывать их.

2 голосов
/ 01 октября 2008

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

count = 0
for line in lines:
    if line.startswith ('"""'):
        count += 1
        if count < 3:
            # Before or during end of the docstring
            continue
    # Line is after docstring

Может потребоваться некоторая адаптация для файлов без строк документации, но если ваши файлы отформатированы последовательно, это должно быть достаточно просто.

0 голосов
/ 02 ноября 2016

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

def split_docstring_and_code(infile):

    import tokenize
    insert_index = None
    f = open(infile)
    for tok, text, (srow, scol), (erow,ecol), l in tokenize.generate_tokens(f.readline):
        if tok == tokenize.COMMENT:
            continue
        elif tok == tokenize.STRING:
            insert_index = erow, ecol
            break
        else:
            break # No docstring found

    lines = open(infile).readlines()
    if insert_index is not None:
        erow = insert_index[0]
        return "".join(lines[:erow]), "".join(lines[erow:])
    else:
        return "", "".join(lines)

Предполагается, что строка, заканчивающая строку документации, не содержит дополнительного кода после закрывающего разделителя строки.

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