我基本上是在从文件中删除注释(读取)并将其写入某个文件。单行注释可以在行的开头,也可以在中间。从评论开始到下一行的部分将被删除。
一些答案提出了下面提到的代码,但它不适用于在一些有用的代码之后出现的单行注释。我对lex有一些了解,所以我尝试修改代码来修复我的需求,但是我被卡住了。请帮忙。
import re
def stripComments(code):
code = str(code)
return re.sub(r'(?m)^ *#.*\n?', '', code)
print(stripComments("""#foo bar
Why so Serious? #This comment doesn't get removed
bar foo
# buz"""))
预期产量:
为什么如此严肃?
吧foo
实际产量:
为什么如此严肃? #This评论不会被删除
吧foo
[新队]
[新队]
试试这个:
import re
def stripComments(code):
code = str(code)
return re.sub(r'(#.*)?\n?', '', code)
print(stripComments("""#foo bar
Why so Serious? #This comment doesn't get removed
bar foo
# buz"""))
# Why so Serious? bar foo
你的正则表达式有一个锚点'^'
,这意味着模式只能从行的开头开始。没有它,它几乎可以工作。
您可能还希望提前编译正则表达式,以便您可以在不进行每次编译的情况下重复使用它:
COMMENT_PATTERN = re.compile('\s*#.*\n?', re.MULTILINE)
def strip_comments(code):
return COMMENT_PATTERN.sub('', str(code))
我还用' '
替换了空间'\s'
,它将匹配任何白色空间,如标签等。如果你不喜欢它,你应该把它放回去。
我认为对你的字符串的基本探索可以比使用re
做得更好(也更快),这是一个有效的例子:
def stripComments(code):
codeWithoutComments = ""
for i in code.splitlines():
marker = False
for j in i:
if j == "#":
marker = True
if not marker:
codeWithoutComments += j
codeWithoutComments += "\n"
return codeWithoutComments
print(stripComments("""#foo bar
Why so Serious? #This comment doesn't get removed
bar foo
# buz"""))
返回值:
"""
Why so Serious?
bar foo
"""
您可以使用regex101.com调试正则表达式并查看它实际匹配的内容。
(?m)
更改匹配规则,以便^
匹配行的开头,而不是整个字符串的开头
^ *
匹配一行的开头,后跟任意数量的空格字符。 (所以希望没有任何标签!)
用简单的英语,你的正则表达式只匹配行开头或任意数量空格后的Python注释。
其他答案已经提供了正则表达式来做你想要的,所以我不会在这里重复。