找到行,替换多行

时间:2012-02-21 21:40:15

标签: text python

找到python的替换文本有很多线程,但我认为我的问题不同。

我有一堆带

的java文件
System.out.println("some text here");

我正在尝试编写一个python脚本,用

替换它们
if (logger.isInfoEnabled()) {
    logger.info("some text here");
}

要做到这一点,我尝试过:

def findReplace(fileName, sourceText, replaceText):
    file = open(fileName, "r") #Opens the file in read-mode
    text = file.read() #Reads the file and assigns the value to a variable
    file.close() #Closes the file (read session)

    file = open(fileName, "w") #Opens the file again, this time in write-mode
    file.write(text.replace(sourceText, replaceText)) #replaces all instances of our keyword
    # and writes the whole output when done, wiping over the old contents of the file
    file.close() #Closes the file (write session)

并传入:

filename=Myfile.java, sourceText='System.out.println', replaceText='if (logger.isInfoEnabled()) { \n' \logger.info'

然而,我正在努力争取在替换中获得结束。它需要包围已经存在的相同输出字符串。有小费吗?

感谢。

2 个答案:

答案 0 :(得分:4)

import re

sourceText = 'System\.out\.println\(("[^"]+")\);'

replaceText = \
r'''if (logger.isInfoEnabled()) {
    logger.info(\1);
}'''

re.sub(sourceText, replaceText, open(fileName).read())

这并不完美 - 只有在字符串不包含任何转义引号(即\")时它才会起作用 - 但希望它可以解决这个问题。

答案 1 :(得分:3)

你肯定会遇到麻烦,因为围绕匹配分隔符做替换是很困难的。对我来说更有意义的一种方法 - 出于更多原因而不是一个 - 是定义一个新的java函数log_if_enabled,然后用System.out.println替换log_if_enabled。这样,你不必担心做任何花式大括号匹配。此外,在函数中封装if语句是DRY。