删除注释块中的文本?* * /在python中

时间:2018-07-31 13:30:22

标签: python

我的输入文件test.sas文件如下所示:

My    
Name is Joe
How are you?;
/* Comment 1 */
/*Comment 2 
blah blah
blah blah blah
blah blah blah blah;*/
/* Comment 3 */
I am great

当我使用以下代码时,得到的结果恰好在代码之后:

writing = True

with open('test.sas', 'r') as file:
    with open('output.sas','w') as out:
        for line in file:
            if writing:
                if '/*' in line:
                    writing = False
                else:
                    out.write(line)
            elif '*/' in line:
                writing = True

结果:

My    
Name is Joe
How are you?;

但是我想得到以下结果:

My    
Name is Joe
How are you?;
I am great

我不知道自己在做什么错。基本上,我想删除注释块中的文本,并将其余部分写到输出文件中。

3 个答案:

答案 0 :(得分:4)

更改您的决赛

        elif '*/' in line:
            writing = True

        if '*/' in line:
            writing = True

这样,如果两个语句都在同一行中,则您可以同时命中它们。

答案 1 :(得分:0)

我在每行末尾添加了一些注释,以显示writing变量的状态。

My                     //True
Name is Joe            //True
How are you?;          //True
/* Comment 1 */        //False
/*Comment 2            //False
blah blah              //False
blah blah blah         //False
blah blah blah blah;*/ //True
/* Comment 3 */        //False
I am great             //False

您知道问题出在哪里吗?由于if语句每行只能评估一次(每个循环一次),因此在同时具有writingTrue的行之后,不会将/*设置为*/

要在一行上检查两个注释符号,请允许两个if语句在一个循环中工作。在程序末尾将elif '*/' in line:更改为if '*/' in line。这样,它可以设置为在每个循环结束时写入,即使它最初将写入设置为False!

答案 2 :(得分:0)

一种选择可能是使用正则表达式(re.sub())来匹配您的引号并将其替换为空字符串。

More on Regex

re.sub()方法用于用其他东西“替换匹配项”

re.sub(样式,替换项,字符串)

模式:(/ * [\ s \ S \ w \ W] ** / \ r?\ n?)-捕捉引号之间的所有内容,然后再加上返回或换行符

import re

with open('text.sas') as f:
    string = f.read()

pattern = r'(/\*[\s\S\w\W]*\*/\r?\n?)'

new_string = re.sub(pattern, '', string)
print(new_string)
""" Output:
My    
Name is Joe
How are you?;
I am great
"""