首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制第n次匹配后的下一行- Python

复制第n次匹配后的下一行- Python
EN

Stack Overflow用户
提问于 2018-04-24 06:22:00
回答 2查看 63关注 0票数 0

我想在“配置vdom”字符串的第三次匹配之后追加行。不幸的是,脚本只考虑第一场比赛。

原始代码:

代码语言:javascript
复制
x = list()

def z():
with open('test.conf', 'r') as rf:
    for line in rf:
        if 'config vdom\n' in line:
            while True:
                line = (rf.__next__())
                if 'end\n' in line:
                    break
                x.append(line)
            with open('test.txt', 'w') as wf:
                wf.writelines(x)
            return

我计划使用枚举,但不确定如何在添加下一行时应用它。

枚举行:

代码语言:javascript
复制
z = [i for i, n in enumerate(y) if n == 'config vdom\n'][2]
print('Line', z, ':', y[z])

输出:

代码语言:javascript
复制
Line 10310 : config vdom

样本数据:

代码语言:javascript
复制
config vdom
config system global
    set admin-maintainer disable
    set admin-scp enable
 end
config vdom*
config system accprofile
    edit "prof_admin"
        set admingrp read-write
        set utmgrp read-write
        set vpngrp read-write
        set wanoptgrp read-write
        set wifi read-write
config vdom*
test sample data
end

预期输出:它应该是下面的三行将添加到x列表中。

代码语言:javascript
复制
config vdom*
test sample data
end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-24 06:45:41

这会有帮助的。

代码语言:javascript
复制
with open('test.txt', 'a') as wf:
    with open('test.conf', 'r') as rf:
        c = 0                 #Checkvalue
        for line in rf:
            if 'config vdom\n' in line:
                c += 1
                if c == 3:      #Check if 3rd "config vdom"
                    while True:
                        line = next(rf)
                        if 'end\n' in line:
                            break
                        wf.writelines(line)      #Write required content. 
票数 0
EN

Stack Overflow用户

发布于 2018-04-24 06:47:55

itertools.groupby可以帮助:

代码语言:javascript
复制
from itertools import groupby
from io import StringIO

text = '''config vdom
config system global
    set admin-maintainer disable
    set admin-scp enable
 end
config vdom*
config system accprofile
    edit "prof_admin"
        set admingrp read-write
        set utmgrp read-write
        set vpngrp read-write
        set wanoptgrp read-write
        set wifi read-write
config vdom*
test sample data
end'''

count = 0
with StringIO(text) as file:
    for key, group in groupby(file, key=lambda x: 'config vdom' in x):
        if key is True:
            count += 1
        if count == 3 and key is False:
            with StringIO() as out_file:
                out_file.writelines(group)
                print(out_file.getvalue())

此打印(或写入您的文件)

代码语言:javascript
复制
test sample data
end

...is是您想要的输出吗?

key对于出现'config vdom'的每一行都是True,对于所有其他行都是false。group收集所有行,直到key的值发生变化。

您需要用所需的文件替换所有StringIO部件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49994703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档