我有这个字符串:
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
答案 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