我一直在努力使用文本文件来使用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
!
答案 0 :(得分:1)
您问题的基本答案非常简单。字符串是不可变的,因此您不能append
或extend
它们。您必须使用串联创建新字符串。
>>> 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)