文件内容如下:
##this is the comment
but this is not comment '####', LOL # this is a normal comment
我只想过滤所有评论并获取过滤后的内容,但我不知道如何避免过滤掉不是评论的英镑符号。
fileLines = [line.strip() for line in file if '#' != line[0] ]
此代码只是可以过滤注释符号,这是一行的第一个字符。
我想要的结果就像下面一行:
but this is not comment '####', LOL
答案 0 :(得分:7)
import shlex
filelines = [' '.join(shlex.split(line,True)) for line in file]
有关详细信息,请参阅shlex docs。
答案 1 :(得分:1)
我会用这个:
fileLines = [line for line in file if not line.lstrip().startswith('#')]
但我很难读你的问题(这些例子的格式很奇怪),所以我真的不知道这是不是你想要的。
答案 2 :(得分:1)
这是一个替代解决方案,它使用tokenize模块去除注释但保留所有其他格式(与shlex不同):
import tokenize
fileLines = []
printed = set()
for toknum, _, (line, col), _, data in tokenize.generate_tokens(file.readline):
if toknum == tokenize.COMMENT:
printed.add(line)
if col != 0:
fileLines.append(data[:col].strip())
elif (toknum in (tokenize.NL, tokenize.NEWLINE) and
line not in printed):
fileLines.append(data.strip())
使用包含您提供的文字的文件,fileLines
将成为以下内容:
['', "but this is not comment '####', LOL"]
请注意,以注释开头的行已完全删除,但保留没有注释的空行。对于中途注释的行,根本不会更改任何格式。
如果您还想删除空白行,则只需将elif
条件更改为toknum == tokenize.NEWLINE and location[0] not in printed
。
答案 3 :(得分:0)
你可以做这样的事情 - 但请注意,如果评论中有引号,这将不起作用:
import re
for line in file:
print re.sub("\#+[\w\s\d]+$", "", l)
如果你真的想在没有shlex的情况下这样做,我认为你必须从行的开头算起并记录引号打开时