使用 Findall 替换和添加多行



我正在尝试向文件添加多行(input.txt(并替换同一文件中的多行(input.txt(,但我的代码只在文件末尾插入行。您知道我如何修复代码以获得我想要的预期输出文件吗?

我的代码:

import re
searchtext1 = """
AB     3.483e-01   2.52e-02 ; 3.46 0.0123
"""
# add these lines after searchtext1
addtext1 = """
CD     2.123e-01   1.31e-02 ; 7.25 0.0145
DE     4.896e-01   7.25e-02 ; 8.25 0.0185
"""
searchtext2 = """
; atom
#atomnumber
#molecule
[weight]
"""
# replace these lines to searchtext2
changetext2 = """
; iron
#48kcal
35 mol
#12 g
"""
with open('input.txt', 'ab+') as infile:
matches1 = re.findall(r'^(d+).(.*)$', searchtext1, re.MULTILINE)
infile.write(addtext1)
matches2 = re.findall(r'^(d+).(.*)$', searchtext2, re.MULTILINE)
infile.write(changetext2)

输入.txt:

[atom]
123
[bonds]
XY     4.212e-01   4.18e-02 ; 8.01 0.0487
AB     3.483e-01   2.52e-02 ; 3.46 0.0123
[molecule]
1 2
3 4
TY     0.412e-01   1.72e-02 ; 0.32 0.0455
; atom
#atomnumber
#molecule
[weight]
calculated value is 5 kcal/mol
end file

预期输出文件:

[atom]
123
[bonds]
XY     4.212e-01   4.18e-02 ; 8.01 0.0487
AB     3.483e-01   2.52e-02 ; 3.46 0.0123
CD     2.123e-01   1.31e-02 ; 7.25 0.0145
DE     4.896e-01   7.25e-02 ; 8.25 0.0185
[molecule]
1 2
3 4
TY     0.412e-01   1.72e-02 ; 0.32 0.0455
; iron
#48kcal
35 mol
#12 g
calculated value is 5 kcal/mol
end file

正如 Chris 在评论中提到的,我建议尝试使用已经可以与格式交互的库 -configparser对我来说似乎是显而易见的选择,但如果格式可以与您的问题不同,则可能有理由不这样做。

除此之外,如果你想使用re,我已经更新了你的代码。以下是我所做的调整:

  • 从三引号字符串的开头和结尾删除了换行符,因为它们将成为匹配的一部分,这可能是您想要的,也可能不是您想要的。我个人的偏好是在实际替换中明确换行符。

  • 搜索文本中的转义[],因为这些是re中的特殊字符,会混淆它(它们指定字符类(。

  • 用于with打开单独的输入和输出文件。当您退出with块时,这些将被清理。如果你真的想替换输入.txt,我想你可以把输出.txt移到顶部。

  • 您可以使用re.sub直接替换匹配项,而不是搜索它们,在文本中找到索引,然后替换/追加。在添加文本的情况下,我刚刚替换了searchtext1addtext1。(我使用了 f 字符串,但如果您愿意,您也可以"{search}n{add}".format(search=searchtext, add=addtext1)

  • 最后,我们将更新的文本写回光盘。

希望对您有所帮助!

import re
searchtext1 = """AB     3.483e-01   2.52e-02 ; 3.46 0.0123"""
# add these lines after searchtext1
addtext1 = """CD     2.123e-01   1.31e-02 ; 7.25 0.0145
DE     4.896e-01   7.25e-02 ; 8.25 0.0185"""
searchtext2 = """; atom
#atomnumber
#molecule
[weight]"""
# replace these lines to searchtext2
changetext2 = """; iron
#48kcal
35 mol
#12 g"""
with open('input.txt', 'r') as infile, open("output.txt", "w") as outfile:
intext = infile.read()
intext = re.sub(searchtext1, f"{searchtext1}n{addtext1}", intext)
intext = re.sub(searchtext2, changetext2, intext)
outfile.write(intext)

您已在追加模式"ab+"中打开文件,该模式指定所有写入都将转到文件末尾。要以所需的方式更改文件的某些部分,必须重写整个文件。

一种常见的模式是创建新的临时文件,写入新数据,然后将新文件移到旧文件上。这样,覆盖是原子的,如果程序崩溃,丢失数据的机会就会降低。

相关内容

  • 没有找到相关文章

最新更新