在两个词之间拆分字符串

2024-04-29 08:29:29 发布

您现在位置:Python中文网/ 问答频道 /正文

以下字符串

text = 'FortyGigE1/0/53\r\nCurrent state: DOWN\r\nLine protocol state: DOWN\r\n\r\nFortyGigE1/0/54\r\nCurrent state: DOWN\r\nLine protocol state: DOWN\r\n\r\n'

应分为以下几部分:

output = [
    'FortyGigE1/0/53\r\nCurrent state: DOWN\r\nLine protocol state: DOWN\r\n\r\n',
    'FortyGigE1/0/54\r\nCurrent state: DOWN\r\nLine protocol state: DOWN\r\n\r\n'
]

拆分后不应删除分隔符

delimiters = '(GigabitEthernet\d*/\d*/\d*\s.*|FortyGigE\d*/\d*/\d*\s.*)'

我试着这样做:

output = re.split(delimiters, text)

但我的输出将是这样的,比我预期的要多得多:

['',
 'FortyGigE1/0/53\r', '\nCurrent state: DOWN\r\nLine protocol state: DOWN\r\n\r\n',
 'FortyGigE1/0/54\r', '\nCurrent state: DOWN\r\nLine protocol state: DOWN\r\n\r\n']

Tags: 字符串textreoutputprotocoldownstate分隔符
2条回答

你的建议给了我解决问题的办法。下面是我的脚本摘录:

f = open(file, "r")
content = f.read()
f.close()
#
# This deliminator is only an example. The interface names are much longer
deliminators = r'(?=\nBridge-Aggregation|\nHundredGigE|\nFortyGigE|\nTen-GigabitEthernet)'
#
dev_interfaces = re.split(deliminators, content)
max_interfaces = len(dev_interfaces)
# Delete the beginning Linefeed (\n) of each interface
dev_interfaces[index] = dev_interfaces[index].lstrip('\n') 

至少通过您的示例,您可以做到:

>>> re.split(r'(?<=DOWN\r\n\r\n)(?=FortyGigE)', text)
['FortyGigE1/0/53\r\nCurrent state: DOWN\r\nLine protocol state: DOWN\r\n\r\n',
 'FortyGigE1/0/54\r\nCurrent state: DOWN\r\nLine protocol state: DOWN\r\n\r\n']

与您所述的期望输出相比:

>>> output==re.split(r'(?<=DOWN\r\n\r\n)(?=FortyGigE)', text)
True

它的工作原理是使用零宽度的回望(?<=DOWN\r\n\r\n)和零宽度的前视(?=FortyGigE)作为分割点

Here is a regex101 demo;由于该平台不支持\r,因此\r将被删除

相关问题 更多 >