使用 findall 替换和添加多行
replace and add multiple lines using 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)
input.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
您已在附加模式“ab+”下打开文件,该模式指定所有写入都将转到文件末尾。要以您想要的方式更改文件的某些部分,您必须重写整个文件。
一种常见的模式是创建一个新的临时文件,写入新数据,然后将新文件移到旧文件上。这样覆盖是原子的,如果你的程序崩溃,你丢失数据的可能性更小。
正如 Chris 在评论中提到的,我建议尝试使用已经可以与格式交互的库 - configparser
对我来说似乎是显而易见的选择,但如果格式可能与您的问题不同。
除此之外,如果您想使用 re
,我已经稍微更新了您的代码。这是我所做的调整:
删除了三引号字符串开头和结尾的换行符,因为它们将成为匹配的一部分,这可能是也可能不是您想要的。我个人的偏好是在实际替换中明确换行。
在您的搜索文本中转义 [
和 ]
,因为这些是 re
中的特殊字符并且会混淆它(它们指定一个字符 class).
使用 with
打开单独的输入和输出文件。当您退出 with
块时,这些将被清除。如果你真的想替换 input.txt,我想你可以在之后将 output.txt 移到顶部。
您可以使用re.sub
直接替换出现的地方,而不是搜索它们,找到文本中的索引然后replacing/appending。在添加文本的情况下,我刚刚对 searchtext1
和 addtext1
进行了替换。 (我用的是 f-string,但如果你愿意,你也可以做 "{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)
我正在尝试向文件中添加多行 (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)
input.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
您已在附加模式“ab+”下打开文件,该模式指定所有写入都将转到文件末尾。要以您想要的方式更改文件的某些部分,您必须重写整个文件。
一种常见的模式是创建一个新的临时文件,写入新数据,然后将新文件移到旧文件上。这样覆盖是原子的,如果你的程序崩溃,你丢失数据的可能性更小。
正如 Chris 在评论中提到的,我建议尝试使用已经可以与格式交互的库 - configparser
对我来说似乎是显而易见的选择,但如果格式可能与您的问题不同。
除此之外,如果您想使用 re
,我已经稍微更新了您的代码。这是我所做的调整:
删除了三引号字符串开头和结尾的换行符,因为它们将成为匹配的一部分,这可能是也可能不是您想要的。我个人的偏好是在实际替换中明确换行。
在您的搜索文本中转义
[
和]
,因为这些是re
中的特殊字符并且会混淆它(它们指定一个字符 class).使用
with
打开单独的输入和输出文件。当您退出with
块时,这些将被清除。如果你真的想替换 input.txt,我想你可以在之后将 output.txt 移到顶部。您可以使用
re.sub
直接替换出现的地方,而不是搜索它们,找到文本中的索引然后replacing/appending。在添加文本的情况下,我刚刚对searchtext1
和addtext1
进行了替换。 (我用的是 f-string,但如果你愿意,你也可以做"{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)