我是初学者并且有以下任务。
问题是我的脚本找到了相应的条目,它也会改变"然而,之前和之后的所有内容都来自" DELETES"" 我需要改变什么?
感谢。
import re
with open("test.cpp", "r+") as f:
match = re.search("^(?P<Text1>.*)COMPILE_TIME_ASSERT\(\s*(?P<Text2>.+),(?P<Text3>\s*)(?P<Text4>\S*)(?P<Text5>\s*\)\s*;s*)", "COMPILE_TIME_ASSERT(TABLE_LENGTH(PopupType2ActionID) == EPopupType::ARRAY_SIZE , PopupType2ActionID_table_needs_revision);")
result = '"' + match.group('Text4') + '"'
如果匹配:
print("%sPCC_STATIC_ASSERT(%s,%s%s" % (match.group('Text1'),
match.group('Text2'), result, match.group('Text5')))
f.write("%sPCC_STATIC_ASSERT(%s,%s%s" % (match.group('Text1'), match.group('Text2'), result, match.group('Text5')))
f.close()
答案 0 :(得分:0)
如果我理解正确你找到了字符串 - &gt;匹配,然后创建一个新字符串。
不幸的是,你做的方式不合适(无论你使用什么编程语言)。这是因为你的文件是以r +打开的,但当你写这行时,所有其余部分都被删除了:-)
为了正确地做到这一点,你需要有一个源文件和一个目标文件,否则你将只用一行替换整个文件:
f.write("%sPCC_STATIC_ASSERT(%s,%s%s" % (match.group('Text1'), match.group('Text2'), result, match.group('Text5')))
好的那么你可以做的就是跟随,试试吧: 1)将原始文件移动到文件〜(正如Microsoft Word所做的那样):
import shutil
shutil.move( afile, afile+"~" )
destination= open( aFile, "w" )
source= open( aFile+"~", "r" )
2)现在你只会&#34;阅读&#34;从原始文件写入具有原始名称的新文件;)
3)为了方便起见,您现在可以逐行阅读原始文件并:
for line in source:
match = re.search(Your_matching, line)
if <matching_condition>:
destination.write( <New_LINE_after_match> + "\n" )
else:
# All the other lines without match, just write back same line
destination.write(line)
source.close()
destination.close()
这已足以生成正确的文件。然后你可以删除〜文件: - )
这是你在python中可以做到的一种方式:-)否则在linux cli上使用sed命令并修改文件: - )
希望这能澄清您的疑问并解决您的问题。祝你今天愉快!
以下简单示例。在txt文件中,我有一个简单的名字: 约翰 彼得 马尔科 米奇 弗兰克
import re,shutil,os
aFile = "marco.txt"
shutil.move( aFile, aFile+"~" )
destination= open(aFile, "w+" )
source= open(aFile+"~", "r" )
for line in source:
match = re.search("Marco", line)
if match:
destination.write( "Modified_Line" + "\n" )
else:
# All the other lines without match, just write back same line
destination.write(line)
source.close()
destination.close()
os.remove(aFile+"~")
marco.txt文件的输出将在运行程序后输出:
John
Peter
Modified_Line
Mickey
Frank
在您的情况下,这应该解决问题。最有可能最大的问题是匹配部分。你必须在re模块中更好地检查,我的它只是一个简单的案例。如果问题解决了,请标记我的答案。