str.startswith () не работает, как я хотел - PullRequest
1 голос
/ 29 мая 2009

Я пытаюсь проверить / или т или пробел, и я не могу понять, почему этот бит кода не будет работать. Что я делаю, так это чтение в файле, подсчет loc для файла, а затем запись имен каждой функции, присутствующей в файле, вместе с их отдельными строками кода. В приведенном ниже фрагменте кода я пытаюсь посчитать loc для функций.

import re

...
    else:
            loc += 1
            for line in infile:
                line_t = line.lstrip()
                if len(line_t) > 0 \
                and not line_t.startswith('#') \
                and not line_t.startswith('"""'):
                    if not line.startswith('\s'):
                        print ('line = ' + repr(line))
                        loc += 1
                        return (loc, name)
                    else:
                        loc += 1
                elif line_t.startswith('"""'):
                    while True:
                        if line_t.rstrip().endswith('"""'):
                            break
                        line_t = infile.readline().rstrip()

            return(loc,name)

Выход:

Enter the file name: test.txt
line = '\tloc = 0\n'

There were 19 lines of code in "test.txt"

Function names:

    count_loc -- 2 lines of code

Как видите, мой тестовый вывод для строки показывает a / t, но оператор if явно говорит (или я так думал), что он должен выполняться только без пробельных символов.

Вот мой полный тестовый файл, который я использовал:

def count_loc(infile):
    """ Receives a file and then returns the amount
        of actual lines of code by not counting commented
        or blank lines """

    loc = 0
    for line in infile:
        line = line.strip()
        if len(line) > 0 \
        and not line.startswith('//') \
        and not line.startswith('/*'):
            loc += 1
            func_loc, func_name = checkForFunction(line);
        elif line.startswith('/*'):
            while True:
                if line.endswith('*/'):
                    break
                line = infile.readline().rstrip()

    return loc

 if __name__ == "__main__":
    print ("Hi")
    Function LOC = 15
    File LOC = 19

Ответы [ 3 ]

8 голосов
/ 29 мая 2009

\s - это только пробел в пакете re при сопоставлении с образцом.

Для startswith, обычного метода обычных строк, \s ничего особенного. Не шаблон, только символы.

3 голосов
/ 30 мая 2009

На ваш вопрос уже дан ответ, и это немного не по теме, но ...

Если вы хотите разобрать код, часто проще и менее подвержен ошибкам использовать синтаксический анализатор. Если ваш код является кодом Python, Python поставляется с парой парсеров ( tokenize , ast , parser ). Для других языков вы можете найти много парсеров в интернете. ANTRL хорошо известен с привязками Python .

Например, следующие несколько строк кода печатают все строки модуля Python, которые не являются комментариями и не являются строками документации:

import tokenize

ignored_tokens = [tokenize.NEWLINE,tokenize.COMMENT,tokenize.N_TOKENS
                 ,tokenize.STRING,tokenize.ENDMARKER,tokenize.INDENT
                 ,tokenize.DEDENT,tokenize.NL]
with open('test.py', 'r') as f:
    g = tokenize.generate_tokens(f.readline)
    line_num = 0
    for a_token in g:
        if a_token[2][0] != line_num and a_token[0] not in ignored_tokens:
            line_num = a_token[2][0]
            print(a_token)

Поскольку a_token выше уже проанализирован, вы также можете легко проверить определение функции. Вы также можете отслеживать, где заканчивается функция, посмотрев на начало текущего столбца a_token[2][1]. Если вы хотите делать более сложные вещи, вы должны использовать ast.

2 голосов
/ 29 мая 2009

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

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