1

我正在尝试测试 /t 或空格字符,但我不明白为什么这段代码不起作用。我正在做的是读取文件,计算文件的位置,然后记录文件中存在的每个函数的名称以及它们各自的代码行。下面的代码是我尝试计算函数的位置的地方。

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

如您所见,我对该行的测试打印显示了 /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
4

3 回答 3

8

\sre在进行模式匹配时只是包的空白。

因为startswith,普通字符串的普通方法,\s没什么特别的。不是模式,只是字符。

于 2009-05-29T19:03:30.430 回答
3

您的问题已经得到解答,这有点离题,但是......

如果要解析代码,使用解析器通常更容易且不易出错。如果您的代码是 Python 代码,Python 会附带几个解析器(tokenizeastparser)。对于其他语言,您可以在 Internet 上找到很多解析器。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已解析,您也可以轻松检查函数定义。您还可以通过查看当前列 start 来跟踪函数的结束位置a_token[2][1]。如果你想做更复杂的事情,你应该使用 ast。

于 2009-05-29T21:04:44.133 回答
2

您的字符串文字不是您认为的那样。您可以像这样指定空格或 TAB:

space = ' '
tab = '\t'
于 2009-05-29T19:05:08.463 回答