0

我有这个字符串:

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

4 回答 4

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'
于 2013-06-18T16:48:52.547 回答
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']
于 2013-06-18T16:43:11.080 回答
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().

于 2013-06-19T09:31:45.330 回答
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)

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

高温高压

于 2013-06-19T09:25:42.320 回答