从字符串中删除“#”注释(注释可以从字符串的ta行之间开始)

时间:2019-03-27 13:56:50

标签: python lex

基本上,我正在努力从文件(读取)中删除注释并将其写入某些文件。 单行注释可以在该行的开头或中间。从注释开始到下一行的部分将被删除。

一些答案​​建议使用以下代码,但不适用于某些有用代码后的单行注释。我对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

     

[换行符]

     

[换行符]

4 个答案:

答案 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注释。

其他答案已经提供了正则表达式来执行您想要的操作,因此在此不再赘述。