Я хочу, чтобы выделить неконкретную строку из списка, используя python

58
6

У меня есть эта строка:

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

спросил(а) 2013-06-18T19:38:00+04:00 7 лет, 4 месяца назад
1
Решение
58

Изменить 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-18T19:43:00+04:00 7 лет, 4 месяца назад
57

Для таких простых манипуляций вам не нужно регулярное выражение.

Используйте 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-19T12:31:00+04:00 7 лет, 4 месяца назад
57

Неясно, является ли 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'

EDIT: Кажется, мы все поняли ваши ожидания неправильно. Использование findall будет иметь мои предпочтения. Однако я упомянул адаптированную версию предложения re.sub для закрытия. Вы также можете сделать это, адаптировав 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-18T19:48:00+04:00 7 лет, 4 месяца назад
41

На выходе этой команды есть две известные вещи:

    имя интерфейса, который мы хотим проверить формат NB: NAME: DESCRIPTION

поэтому здесь regexp:

>>> 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 параметры интерфейса.

НТН

ответил(а) 2013-06-19T12:25:00+04:00 7 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема