Python中的条件添加

时间:2011-08-05 18:22:20

标签: python

我一直在努力使用文本文件来使用Python执行条件追加/扩展某些文本。如果这是过于基本的,并且已经在这里以某种方式进行了讨论,我提前道歉:(

关于代码(附件),我需要在包含“description”的语句下添加语句“mtu 1546”,只要它不存在。另外,我希望只有在不存在的情况下,才能在interface语句(和/或mtu语句,如果可用)下添加“description TEST”语句。我使用的是python 2.7。

这是我的代码:

import re

f = open('/TESTFOLDER/TEST.txt','r')
interfaces=re.findall(r'(^interface Vlan[\d+].*\n.+?\n!)',f.read(),re.DOTALL|re.MULTILINE)

for i in interfaces:
    interfaceslist = i.split("!")
    for i in interfaceslist:
        if "mtu" not in i:
            print i


f.close()

print语句可以正常工作,因为它能够正确打印有趣的行,但是我的要求是将所需的语句添加(追加/扩展)到列表中,这样我就可以进一步使用它来解析和填充。在尝试追加/扩展函数时,解释器会将其抱怨为字符串对象。这是示例源文件(文本)。我将解析的文本文件很大,所以只添加有趣的文本。

!
interface Vlan2268
 description SNMA_Lovetch_mgmt
 mtu 1546
 no ip address
 xconnect 22.93.94.56 2268 encapsulation mpls
!
interface Vlan2269
 description SNMA_Targoviste_mgmt
 mtu 1546
 no ip address
 xconnect 22.93.94.90 2269 encapsulation mpls
!
interface Vlan2272
 mtu 1546
 no ip address
 xconnect 22.93.94.72 2272 encapsulation mpls
!
interface Vlan2282
 description SNMA_Ruse_mgmt
 no ip address
 xconnect 22.93.94.38 2282 encapsulation mpls
!
interface Vlan2284
 mtu 1546
 no ip address
 xconnect vfi SNMA_Razgrad_mgmt
!
interface Vlan2286
 description mgmt_SNMA_Rs
 no ip address
 xconnect 22.93.94.86 2286 encapsulation mpls
!
interface Vlan2292
 description SNMA_Vraca_mgmt
 mtu 1546
 no ip address
 xconnect 22.93.94.60 2292 encapsulation mpls
!

2 个答案:

答案 0 :(得分:1)

您问题的基本答案非常简单。字符串是不可变的,因此您不能appendextend它们。您必须使用串联创建新字符串。

>>> print i
interface Vlan2286
 description mgmt_SNMA_Rs
 no ip address
 xconnect 22.93.94.86 2286 encapsulation mpls

>>> print i + ' mtu 1546\n'
interface Vlan2286
 description mgmt_SNMA_Rs
 no ip address
 xconnect 22.93.94.86 2286 encapsulation mpls
 mtu 1546

然后你必须将结果保存到变量名或某种容器中。你可以把它保存到我喜欢的那样:

i = i + ' mtu 1546\n'

或者像这样:

i += ' mtu 1546\n'

但在这种情况下,列表理解可能有用......

def add_mtu(i):
    return i if "mtu" in i else i + " mtu 1546\n"

for iface in interfaces:
    interfaceslist = iface.split("!")
    updated_ifaces = [add_mtu(i) for i in interfaceslist]

请注意,为了清楚起见,我将第一个i替换为iface。而且,在我看来,iface目前只有一个interfaces。也许你需要for循环,但如果没有,它会简化删除它的事情。

答案 1 :(得分:1)

如果您可以阅读整个文件:

import re

f = open('/TESTFOLDER/TEST.txt','r')
text = f.read()

text = re.sub(r"(?m)(^interface Vlan\d+.*\n(?! description )", r"\1 description TEST\n", text)
text = re.sub(r"(?m)(^interface Vlan\d+.*\n description .+\n)(?! mtu )", r"\1 mtu 1546\n", text)