打印删除正则表达式失败

时间:2015-05-01 17:52:46

标签: python regex

我正在编写一个漂亮的脚本,我们都需要在编码滚动之前从目录/或单个python文件中删除python文件中的所有print语句。我有printremover.py:

def read_content_to_linelist(the_file):
    try:
        f = file(the_file, 'r')
        content = f.readlines()
        f.close()
        return content
    except IOError:
        return 0

def remove_print(linelist):
    string = ""
    for line in linelist:
        if re.match(r"^\s*print.*", line):
            linelist.remove(line)
        else:
    for line in linelist:
        string += line
    return string

我在测试时使用的是假冒文件:

name = 'cody'

print name
print 'cody'
print 4

当我从read_content_to_linelist打印列表时,我得到了很好的数据。但是当我remove_print时,除了由于某种原因离开print 'cody'之外我完全正确。它确实保留变量,并删除其他2个打印件。

4 个答案:

答案 0 :(得分:1)

remove_print中,第一个循环应为:

for line in linelist[:]:
    ...

这将创建linelist的副本,如果在循环内修改它,则必须使用该副本。

另外,你的else可以(应该)被遗漏,因为它没有任何反应。

另外注意,你的正则表达式不需要前导插入符号(^),因为re.match从字符串的开头检查;你只需要re.search的插入符号。

答案 1 :(得分:1)

您应该使用re.sub代替。当您从remove list时,订单会发生变化。在for循环

  1. 第一个元素被删除。

  2. 第二个元素代替第一个,第三个代替第二个元素。

  3. for循环计数器位于秒,但元素已更改。

  4. 直接使用

    print re.sub(r"^\s*print.*$","",x,flags=re.MULTILINE)
    

    其中xf.read()

答案 2 :(得分:1)

您的问题是您在循环时修改列表。使用内置的filterjoin函数可以大大简化您的逻辑:

def read_content_to_linelist(the_file):
    try:
        f = file(the_file, 'r')
        content = f.readlines()
        f.close()
        return content
    except IOError:
        return 0

def good_line(line):
    return not re.match(r"\s*print.*", line)

def remove_print(linelist):
    good_lines = filter(good_line, linelist)
    return ''.join(good_lines)

答案 3 :(得分:1)

您可以将unparser.py与ast模块一起使用来删除打印件:

import inspect
import importlib
import ast
from unparser import Unparser # unparser.py

class RemovePrint(ast.NodeTransformer):
    def __init__(self):
        self.count = 0
    def visit_Print(self, node):
        self.count += 1
        print("Removed {} print/s".format(self.count))
        self.generic_visit(node)
    return None




mod = "yourfile"
mod = importlib.import_module(mod)
p = ast.parse(inspect.getsource(mod))

t = RemovePrint().visit(p)
print(ast.dump(p))
Module(body=[Assign(targets=[Name(id='name', ctx=Store())], `value=Str(s='cody')), FunctionDef(name='foo', args=arguments(args=[Name(id='x', ctx=Param())], vararg=None, kwarg=None, defaults=[]), body=[AugAssign(target=Name(id='x', ctx=Store()), op=Add(), value=Num(n=4)), Return(value=Name(id='x', ctx=Load()))], decorator_list=[]), ClassDef(name='Foo', bases=[], body=[FunctionDef(name='__init__', args=arguments(args=[Name(id='self', ctx=Param())], vararg=None, kwarg=None, defaults=[]), body=[Assign(targets=[Attribute(value=Name(id='self', ctx=Load()), attr='foo', ctx=Store())], value=Str(s='foo'))], decorator_list=[])], decorator_list=[])]`)


Unparser(p, open("temp_test.py", "w"))

需要一些工作但输出:

name = 'cody'

def foo(x):
    x += 4
    return x

class Foo:

    def __init__(self):
        self.foo = 'foo'
'

自:

name = 'cody
print name
print 'cody'
print 4


def foo(x):
    x += 4
    print x
    return x


class Foo:
    def __init__(self):
        self.foo = "foo"
        print("foo")

这不能使用python3并且只使用python2.7进行测试,我将在工作时添加python3代码。