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

问题描述 投票:0回答:4

我基本上是在从文件中删除注释(读取)并将其写入某个文件。单行注释可以在行的开头,也可以在中间。从评论开始到下一行的部分将被删除。

一些答案提出了下面提到的代码,但它不适用于在一些有用的代码之后出现的单行注释。我对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

[新队]

[新队]

python lex
4个回答
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
投票

你的正则表达式有一个锚点'^',这意味着模式只能从行的开头开始。没有它,它几乎可以工作。

您可能还希望提前编译正则表达式,以便您可以在不进行每次编译的情况下重复使用它:

COMMENT_PATTERN = re.compile('\s*#.*\n?', re.MULTILINE)


def strip_comments(code):
    return COMMENT_PATTERN.sub('', str(code))

我还用' '替换了空间'\s',它将匹配任何白色空间,如标签等。如果你不喜欢它,你应该把它放回去。


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

"""

0
投票

您可以使用regex101.com调试正则表达式并查看它实际匹配的内容。

(?m)更改匹配规则,以便^匹配行的开头,而不是整个字符串的开头

^ *匹配一行的开头,后跟任意数量的空格字符。 (所以希望没有任何标签!)

用简单的英语,你的正则表达式只匹配行开头或任意数量空格后的Python注释。

其他答案已经提供了正则表达式来做你想要的,所以我不会在这里重复。

© www.soinside.com 2019 - 2024. All rights reserved.