我正在尝试测试/ t或空格字符,我无法理解为什么这些代码不起作用。我正在做的是读取文件,计算文件的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
正如你所看到的,我对该行的测试打印显示了一个/ 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
答案 0 :(得分:8)
\s
只是re
包的空格。
对于startswith
,普通字符串的普通方法\s
并不特别。不是模式,只是字符。
答案 1 :(得分:3)
您的问题已经得到解答,这有点偏离主题,但是......
如果要解析代码,使用解析器通常更容易,也更不容易出错。如果您的代码是Python代码,Python会附带几个解析器(tokenize,ast,parser)。对于其他语言,您可以在互联网上找到很多解析器。 ANTRL是众所周知的Python bindings。
作为示例,以下几行代码打印的Python模块的所有行都不是注释而不是doc-strings:
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 :(得分:2)
你的字符串文字不是你认为的那样。 您可以像这样指定空格或TAB:
space = ' '
tab = '\t'