[python] 去除代码源文件中单行注释

代码

"""
利用正则表达式去除文件中的单行注释,支持多行稍加更改即可
"""

import os
import re


pattern_c = {re.compile(r'//.*'), re.compile(r'/\*.*?\*/'), }
# /* ... /* ... */ 应该是首尾的进行匹配而不是第二个和末尾匹配
# 去c/c++单行注释(可改成多行),匹配 // /**/ 两种注释

pattern_cpp = pattern_c

pattern_py = {re.compile(r'#.*'), re.compile(r'(""".*?""")*|(\'\'\'.*?\'\'\')*'), }

pattern_js = pattern_c

pattern_html = {re.compile(r'<!--.*?-->'), }

pattern_less = pattern_c

pattern_wxml = pattern_html

pattern_vue = {*pattern_html, *pattern_js, *pattern_less, }

pattern_map = {
    'c': pattern_c,
    'cpp': pattern_c,
    'py': pattern_py,
    'js': pattern_js,
    'html': pattern_html,
    'less': pattern_less,
    'wxml': pattern_wxml,
    'vue': pattern_vue,
}


def parse(string, ext='py'):
    """
    去某一字符串包含的注释,默认处理python文件
    """

    if ext not in pattern_map:
        return string
        
    result = string
    for p in pattern_map[ext]:
        result = re.sub(p, "", result)
    return result


def parse_file(file_path, output='string'):
    """
    去除某一源码文件的注释,并将修改后的字符串写入新文件
    由于是一行行处理,无法去除多行注释,先读出整个content再处理即可支持多行(也要pattern支持)
    """

    name, ext = os.path.splitext(file_path)

    content = ""
    with open(file_path, "r", encoding='utf-8') as f:
        for line in f:
            # res_f.writeline(parse(line))
            content += parse(line, ext[1:])
            # 不要后缀前面的dot

    new_file_path = f"{name}_noC{ext}"
        
    if output == 'string':
        return content

    elif output == 'file':
        with open(new_file_path, "w", encoding='utf-8') as f:
            f.write(content)
        return new_file_path


if __name__ == "__main__":
    try:
        parse_file(file_path=r'H:\folder\test.py', output='file')
    except Exception as e:
        print(e)
    input("处理完成")

使用

  • 修改入口parse_file的参数,output='file'会生成去除了注释后的文件
  • 本意是与代码统计脚本搭配
posted @ 2020-12-08 09:25  NoNoe  阅读(878)  评论(0编辑  收藏  举报