我的示例代码写在包含多个打印语句的文件中,
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 之外的所有打印报表,并将代码保存在同一文件中。
答案 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倍。您可以将其更改为您想要的任何数量。