Python - 用re替换文件中的值

时间:2015-11-11 17:45:11

标签: python regex

我有这个文件:

......
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.2.2
netmask 255.255.255.0
otheraddress - this line is an example192.168.2.2
......

我想替换地址ip并拥有此代码。

import re

def get_value(filepath, regex):
    f = open(filepath, 'r')
    lines = f.readlines()
    for line in lines:
        match = re.search(regex, line)
        if match:
            return(match.group(1))
    f.close()

def new_value(filepath, regex, value, newvalue):
    f = open(filepath, 'r')
    filedata = f.read()
    f.close()
    newdata = filedata.replace(value, newvalue)
    f = open(filepath, 'w')
    f.write(newdata)
    f.close()

def network():
    filepath = '/etc/network/interfaces'
    regex = 'address\s(.*)'
    ipaddr = get_value(filepath, regex)
    newipaddr = input('Dirección ip [' + ipaddr + ']: ')
    new_value(filepath, ipaddr, newipaddr)

如果我执行我的代码,来自new_value()的filedata.replace会替换我的文件中的line otheraddress,因为它也匹配ipaddr值。 我尝试在new_value中使用re.search()来使用正则表达式并仅替换有效行,但我不能运行,因为我需要对文件进行写入更改并逐行读取文件以将正则表达式应用于行

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

编辑:回顾一下您的代码后,您还有其他一些问题。下面的方法将允许您逐行读取文件,必要时进行替换,并在完成后将新数据写回文件:

import re

def network():
    filepath = '/etc/network/interfaces'
    filedata = []
    regex = r'^address ((\d+\.?)+)'

    with open(filepath, 'r') as f:
        for line in f:
            match = re.match(regex, line)
            if match:
                ipaddr = input('Dirección ip [' + match.group(1) + ']: ')
                line = line.replace(match.group(1), ipaddr)
            filedata.append(line)

    with open(filepath, 'w') as f:
        f.writelines(filedata)

我还使用了context manager来处理文件,而不是明确地打开和关闭文件。

答案 1 :(得分:1)

以下是您的代码的稍微修改版本,它再次使用“搜索”正则表达式进行替换:

import re

def get_value(filepath, regex):
    f = open(filepath, 'r')
    lines = f.readlines()
    for line in lines:
        match = re.search(regex, line)
        if match:
            return(match.group(1))
    f.close()

def new_value(filepath, regexsearch, regexreplace):
    f = open(filepath, 'r')
    filedata = f.read()
    f.close()
    newdata = re.sub(regexsearch, regexreplace, filedata, count=1, flags=re.MULTILINE)
    f = open(filepath, 'w')
    f.write(newdata)
    f.close()

def network():
    filepath = '/etc/network/interfaces'
    regexsearch = r'^(address\s)(.*)$'
    ipaddr = get_value(filepath, regexsearch)
    newipaddr = input('Dirección ip [' + ipaddr + ']: ')
    regexreplace = r'\g<1>' + newipaddr
    new_value(filepath, regexsearch, regexreplace)

它只会替换文件中找到的第一个实例,如果要替换所有实例,请删除count=1