关于python中的字符串替换

时间:2014-08-19 14:57:50

标签: python

我有一个lid_details.txt这样的文件:

sdlfksdflsdsdf          -       10.3.2.142

qweioqwieuew            -       10.123.23.12

98327499a87             -       10.3.2.142

sdflkuw39834tn          -       10.3.2.142

kfpe84of9               -       10.3.2.142

dfgiueorgkdk            -       10.3.2.142

其中我想用用户指定的新ipaddress替换ipaddress。

def modifyEntry(self, new_ip):

                fileref = open ("lid_details.txt","a+")
                for line in fileref:
                        match = re.search(r'(\w+)\s+-\s+(.*)', line)
                        if ( (match.group(1).strip()) == self.id):
                                print (match.group(2))
                                print new_ip
                                line = line.replace(match.group(2).strip() , new_ip)
                                print line

我将此文件导入另一个文件。考虑这是我从另一个文件调用的相应模块,其中new_ip是我要替换的新ipaddress。

我能够在执行打印行语句时看到地址被反射回来。 但是当我打开文件lid_details.txt时,我发现那个旧的ip仍然是相同的。

请让我知道解决方案,以及原因。

2 个答案:

答案 0 :(得分:0)

您要修改的字符串是内存中的字符串。 您必须在文件中写入修改后的行,以便有效地修改它。

答案 1 :(得分:0)

使用fileref.readlines()将所有行添加到列表中,使用enumerate跟踪每行的索引,然后将更新的数据写入文件,如果要替换您执行的数据不想使用a,因为这会附加到文件而不会覆盖旧值

def modifyEntry(self, new_ip):
    with  open ("lid_details.txt","r") as fileref:
        lines = fileref.readlines()
        for ind,line in enumerate(lines):
            match = re.search(r'(\w+)\s+-\s+(.*)', line)
            if match: # check if we have a match first
                if match.group(1).strip() == self.id:
                    lines[ind]= line.replace(match.group(2) ,new_ip) # replace updated line in lines
        with open("lid_details.txt","w") as f: # open in `w` mode and write updated values
            for line in lines:
                fileref.write(line)

您还应首先使用if match,因为当您选中if match.group(1)时,没有匹配ip的行会导致错误。

使用:

line = line.replace(match.group(2).strip() , new_ip)

只创建一个新的变量行,其值是更新的行字符串,而不写入文件,它不会更改文件内容。

如果您提交的文件如上所示,则不需要重新输入:

def modifyEntry( new_ip):
    with open ("lid_details.txt","r+") as fileref:
        lines = fileref.readlines()
        for ind,line in enumerate(lines):
            spl = line.rsplit(" ",1)
            if spl[-1].rstrip() == self.id:
                        lines[ind] = line.replace(spl[1] ,new_ip+"\n")
        with open("lid_details.txt","w") as f:
            for line in lines:
                fileref.write(line)

如果你只是想从线上获得ip,你可以使用:

match = re.findall(r'\d+\.\d+\.\d+\.\d+', line)

使用findall:

def modifyEntry( new_ip):
    with open ("lid_details.txt","r+") as fileref:
        lines = fileref.readlines()
        for ind,line in enumerate(lines):
            match = re.findall(r'\d+\.\d+\.\d+\.\d+', line) # match 10.0.0.1 etc..
            if match:
                if match[0] == self.id:
                    lines[ind] = line.replace(match[0] ,new_ip+"\n")
        with open("lid_details.txt","w") as f:
            for line in lines:
                f.write(line)

您还应该使用with打开文件,它会自动关闭它们,或者至少在您完成后关闭文件。