在Jython中替换多行

0 投票
1 回答
1423 浏览
提问于 2025-04-15 16:43

我写了一个小程序,用来替换一组字符,但我还想在一个程序里实现两个或更多的替换命令。

另外,我还想在随机的一组字符后面加一个括号。

这是我的程序

file_read=open('<%=odiRef.getOption("READ")%>/EXPORT.XML','r')
file_write=open('<%=odiRef.getOption("READ")%>/EXPORT_1.XML','w')
count_record=file_read.read()
while count_record :
    s=count_record.replace('<Field name="ExeDb"type="java.lang.String"><![CDATA[S]]></Field>','<Field name="ExeDb" type="java.lang.String"><![CDATA[W]]></Field>')
    file_write.write(s)
    t=count_record.replace('<Field name="Txt" type="java.lang.String"><![CDATA[','<Field name="Txt" type="java.lang.String"><![CDATA[TRIM(')
    file_write.write(t)
    count_record=file_read.read()
    print s
file_read.close()
file_write.close()

你可以看到,当我尝试用读取行的方式时,最终的文件里出现了两行。

1) 我希望两个替换命令都能在同一个文件中工作。

2) 还有没有办法在一个文件中同时读取和写入,我不知道为什么r+没有正常工作。

3) 我还想修改这一行

t=count_record.replace('<Field name="Txt" type="java.lang.String"><![CDATA[','<Field name="Txt" type="java.lang.String"><![CDATA[TRIM(')

变成类似这样的

t=count_record.replace('<Field name="Txt" type="java.lang.String"><![CDATA[','<Field name="Txt" type="java.lang.String"><![CDATA[TRIM($$$) ')

其中$$$代表源文件中存在的单词或字符。

简单来说,就是在开括号后面无论有多少个单词或字符,都在最后加一个闭括号。

非常感谢大家的帮助。

1 个回答

3

这个说法有很多问题——你不能同时从同一个文件中读取和写入。file.read()这个命令会读取整个文件的内容,而且你不需要在每次替换后都保存文件。可以用类似这样的方式:

file = open('myfile', 'r+')
contents = file.read()
file.seek(0) # rewind    
file.write(contents.replace('something', 'else').replace('and this too', 'replaced'))

注释的代码有点乱,包括这里的内容……你需要用正则表达式来替换它。看看“re”模块的说明,基本上你需要这样的东西:

import re
contents = re.sub(
  '<Field name="Txt" type="java.lang.String"><!\[CDATA\[TRIM\(([^)]*)\]\]></Field>', 
  '<Field name="Txt" type="java.lang.String"><![CDATA[TRIM(\1)]]></Field>', 
  contents
)

撰写回答