如何使用正则表达式拆分多行字符串?

时间:2017-05-30 02:01:55

标签: python regex

我一直在尝试各种各样的事情,一直在敲打我的初学者头。

这是字符串

1    default                          active    Eth2/45, Eth2/46, Eth2/47
                                                Eth3/41, Eth3/42, Eth3/43
                                                Eth4/41, Eth4/42, Eth4/43
47   Production                          active    Po1, Po21, Po23, Po25, Po101
                                                Po102, Eth2/1, Eth2/2, Eth2/3
                                                Eth2/4, Eth3/29, Eth3/30
                                                Eth3/31, Eth3/32, Eth3/33
                                                Eth3/34, Eth3/35, Eth3/36
                                                Eth3/37, Eth3/38, Eth3/39
                                                Eth3/40, Eth3/44, Eth4/29
                                                Eth4/30, Eth4/31, Eth4/32
                                                Eth4/33, Eth4/34, Eth4/35
                                                Eth4/36, Eth4/37, Eth4/38
                                                Eth4/39, Eth4/40, Eth4/44
128  Test               active    Po1, Eth1/13, Eth2/1, Eth2/2
                                                Eth2/3, Eth2/4
129  Backup             active    Po1, Eth1/14, Eth2/1, Eth2/2
                                                Eth2/3, Eth2/4

我需要的是如下分割。我曾尝试使用regex101.com来模拟各种正则表达式,但我没有太多运气。我设法用(\n\d+)隔离分隔符,然后我想使用lookbehind但是我得到一个错误,说我需要固定的字符串长度。
以下是regex101 section的链接:

1    default                          active    Eth2/45, Eth2/46, Eth2/47
                                                Eth3/41, Eth3/42, Eth3/43
                                                Eth4/41, Eth4/42, Eth4/43
47   VLAN047                          active    Po1, Po21, Po23, Po25, Po101
                                                Po102, Eth2/1, Eth2/2, Eth2/3
                                                Eth2/4, Eth3/29, Eth3/30
                                                Eth3/31, Eth3/32, Eth3/33
                                                Eth3/34, Eth3/35, Eth3/36
                                                Eth3/37, Eth3/38, Eth3/39
                                                Eth3/40, Eth3/44, Eth4/29
                                                Eth4/30, Eth4/31, Eth4/32
                                                Eth4/33, Eth4/34, Eth4/35
                                                Eth4/36, Eth4/37, Eth4/38
                                                Eth4/39, Eth4/40, Eth4/44
128  Rogers-Refresh-MGT               active    Po1, Eth1/13, Eth2/1, Eth2/2
                                                Eth2/3, Eth2/4
129  ManagementSegtNorthW             active    Po1, Eth1/14, Eth2/1, Eth2/2
                                                Eth2/3, Eth2/4

更新:我更新了the regex101 example,但它没有选择我想要的内容。 python代码有效。我想知道regex101有什么问题

2 个答案:

答案 0 :(得分:2)

在python中,总有不止一种方法可以给猫皮肤。多线正则表达通常很难。以下是更简单,更重要的可读性

for line in data.split("\n"):
    if line[0].isdigit():
        if section:
            sections.append("\n".join(section))
            section=[]
        section.append(line)

sections.append("\n".join(section))  # grab the last one

print(sections)

性能方面,我认为这可能会更好,因为我们不会在整个字符串中寻找模式。我们只看一行中的第一个字符。

答案 1 :(得分:2)

这很简单 - 使用先行而不是lookbehind:

parsed = re.split(r'\n(?=\d)', data)