Python正则表达式搜索并替换所有print语句

时间:2017-09-03 15:31:02

标签: python regex file

我的示例代码写在包含多个打印语句的文件中,

def get_address(cls,latitude,longitude):
    try:
        geolocator = GoogleV3()
        location = geolocator.reverse(latitude,longitude)
        print location
        print location.address
        print "location"
        print("location")
        return (location.address)
    except Exception as e:
        print e

使用正则表达式删除此代码中的所有打印语句(print e除外), 我的代码:

import re
regex = r"print[/s]?[^e]?(.)+"
try:
    print (re.sub(regex, "AA", str))
except Exception as e:
    print e
old_file=open("views.py")
new_file=open("new_text.py", "w")
for line in old_file:
    new_line = re.sub(regex, "", line)
    new_file.write(new_line)
old_file.close()
new_file.close()

我的代码是在views.py中编写的,这是new_text.py中的一个新代码,运行此脚本后,打印e 也会在异常中删除,这会导致语法错误。是否有任何好方法可以删除除打印e 之外的所有打印报表,并将代码保存在同一文件中。

2 个答案:

答案 0 :(得分:2)

由于只有三个例外,一个简单的解决方案是跳过它们:

allowed_prints = ['print(e)', 'print (e)', 'print e']
for line in old_file:
    stripped = line.strip()
    # or, if you want to account for comments in the print line:   
    # stripped = line.split('#')[0].strip()
    if stripped.startswith('print') and stripped not in allowed_prints:
        continue
    new_file.write(line)

答案 1 :(得分:1)

你可以用负前瞻模式做到这一点。将您的模式更改为

print[/s]?(?! e)(.)+

会做的工作。 (?!) - 是负前瞻断言,仅当下一个字符不匹配时才匹配

例如,

>>> p = re.compile('print[/s]?(?! e)(.)+')
>>> 
>>> re.match(p, 'print abc')
<_sre.SRE_Match object at 0x028745E0>
>>> re.match(p, 'print e')
>>> 

如果您想支持多个e,可以按如下方式定义:

>>> re.match('print (?!e{1,5}$)\D+', 'print ele')
<_sre.SRE_Match object at 0x00000000042904A8>
>>> re.match('print (?!e{1,5}$)\D+', 'print ee')
>>> re.match('print (?!e{1,5}$)\D+', 'print eee')

这将匹配e(打印eeeee)的1到5倍。您可以将其更改为您想要的任何数量。