我希望能够使用python从列表中隔离非特定字符串

时间:2013-06-18 16:38:57

标签: python regex string

我有这个字符串:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000

我希望能够从此字符串中删除'eth0'部分,但它可能并不总是eth0!它在“2:”部分之后的定位是一致的。

有什么想法吗?

编辑:

总的想法是隔离接口名称'lo','eth0'等。这是一个较长的例子:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:e0:c8:10:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.1/24 brd 192.168.100.255 scope global eth0
    inet 192.168.200.16/32 scope global eth0
    inet 192.168.200.17/32 scope global eth0
    inet 192.168.200.18/32 scope global eth0
3: gre0: <NOARP> mtu 1476 qdisc noop state DOWN 
    link/gre 0.0.0.0 brd 0.0.0.0
4: 3g-wan1: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 3
    link/ppp 

4 个答案:

答案 0 :(得分:1)

编辑2:更新问题的新答案。

使用re.findall(r'\d+: (.*?):', string)

import re

string = """
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:e0:c8:10:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.1/24 brd 192.168.100.255 scope global eth0
    inet 192.168.200.16/32 scope global eth0
    inet 192.168.200.17/32 scope global eth0
    inet 192.168.200.18/32 scope global eth0
3: gre0: <NOARP> mtu 1476 qdisc noop state DOWN
    link/gre 0.0.0.0 brd 0.0.0.0
4: 3g-wan1: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 3
    link/ppp
"""
print re.findall(r'\d+: (.*?):', string)

输出:

['lo', 'eth0', 'gre0', '3g-wan1']

答案 1 :(得分:1)

目前尚不清楚2是否是固定部分。您可以尝试各种变体:

import re
re.sub("(\d*:)[^:]*:(.*)", "\\1\\2", "2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000")

结果:

'2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000'

编辑:我们似乎都错误地理解了您的期望。 @Dogbert使用findall会有我的偏好。但是,我会提到re.sub关闭提案的改编版本。您也可以通过调整上面显示的re.sub函数调用来完成此操作:

>>> re.sub("\d*: *([^:]*):.*", "\\1", "2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000")
'eth0'

答案 2 :(得分:1)

你不需要正则表达式进行这种简单的操作。

使用split()。假设s是您的字符串:

pre, x, after = s.split(': ', 2)
s_without_x = ': '.join([pre, after])

结果:

>>> x
'eth0'
>>> s_without_x
'2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000'

如果您想将其应用于任何一行,可以查看if s[0].isdigit()

答案 3 :(得分:0)

在该命令的输出上有两个已知的东西:

  • 我们要检查的界面名称
  • 格式NB: NAME: DESCRIPTION

所以这是一个正则表达式:

>>> s = "2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000"
>>> re.sub('\d+: eth0: ', '', s)
'<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000'

现在您可以对其进行参数化:

>>> iface = 'eth0'
>>> s = "2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000"
>>> re.sub(r'\d+: {}: '.format(iface), '', s)
'<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000'

所以你可以使它成为一个功能:

def get_iface_params(iface):
    out = subprocess.check_output(['ip', 'addr'])
    for s in out:
        if 'eth0' in s:
            return re.sub(r'\d+: {}: '.format(iface), '', s)

现在,如果您将iface lo作为参数进行调用,它将为您提供lo接口参数。

HTH