基本上,我正在努力从文件(读取)中删除注释并将其写入某些文件。 单行注释可以在该行的开头或中间。从注释开始到下一行的部分将被删除。
一些答案建议使用以下代码,但不适用于某些有用代码后的单行注释。我对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"""))
预期输出:
为什么这么认真?
bar foo
实际输出:
为什么这么认真? #此评论不会被删除
bar foo
[换行符]
[换行符]
答案 0 :(得分:2)
尝试一下:
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
答案 1 :(得分:1)
您的正则表达式具有锚点'^'
,这意味着模式只能在行的开头开始。没有这个,它几乎可以工作。
您可能还希望提前编译正则表达式,以便无需每次编译即可重新使用它:
COMMENT_PATTERN = re.compile('\s*#.*\n?', re.MULTILINE)
def strip_comments(code):
return COMMENT_PATTERN.sub('', str(code))
我还用' '
替换了'\s'
空格,该空格将匹配制表符等任何空白。如果您不喜欢,应将其放回去。
答案 2 :(得分:0)
我认为对字符串的基本探索比使用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
"""
答案 3 :(得分:0)
您可以使用regex101.com调试正则表达式,并查看其实际匹配项。
(?m)
更改匹配规则,以使^
匹配行的开头,而不是整个字符串的开头
^ *
与行首匹配,后跟任意数量的空格字符。 (因此希望没有任何标签!)
用简单的英语来说,您的正则表达式仅匹配行首或空格后的Python注释。
其他答案已经提供了正则表达式来执行您想要的操作,因此在此不再赘述。