x
- это строка с разделителями строк \r\n
. Каждая «строка» не разграничена стандартным образом (например, вкладка), а скорее несколькими пробелами. Там probably an elegant way to handle this.
Первая строка пуста, вторая строка - заголовки, третья строка - всего лишь строка -----
, поэтому вам нужно перейти от строки 4 до конца.
import subprocess
import re
p = subprocess.Popen('netsh interface show interface',stdout=subprocess.PIPE)
[x, err] = p.communicate()
items = x.split('\r\n')
for itm in items[3:]:
## convert this to a delimited line for ease of processing:
itm = re.sub('\s\s+', '\t', itm)
print(itm.split('\t')[-1])
Результаты:
Или доработан:
import subprocess
import re
p = subprocess.Popen('netsh interface show interface',stdout=subprocess.PIPE)
[x, err] = p.communicate()
items = x.split('\r\n')
print('\n'.join(map(lambda itm: re.sub('\s\s+', '\t', itm).split('\t')[-1], items[3:])))
Обновление от Комментарии
так это ж orks по назначению, хотя, если у меня есть 4 интерфейса и Я просто хочу прочитать первый, что было бы лучшим способом сделать это? Я пробовал искать регулярное выражение, но не смог найти способ просто сохранить первую строку и удалить остальную часть результатов.
Для этого не требуется регулярное выражение. Единственное, что я использовал regex for, было преобразование любого экземпляра из нескольких символов пробела в символ \t
(tab), чтобы мы могли легко разобрать строки, используя split
. В противном случае, как вы наблюдали, он будет производить выходы, как 'Local', 'Area', 'Network'
Итак подход я выше предположил, что вы хотели, чтобы распечатать все имен, и мы определили, что эти элементы начинают в строке 4 стандартный вывод , Вот почему мы сделали:
for itm in items[3:]:
Эта линия говорит «не перебирать каждую вещь в items
, от третьего вещи до самой последней вещи.» This is a concept known as slicing, который можно сделать на любой последовательности объекта (строка, кортеж, список и т.д.)
У меня есть ниже для соединений и просто хочу знать имя соединения и удалить остальные из моего результата.
Таким образом, мы больше не нужно итерации (что делается, если нужно обработать каждый элемент). Мы знаем, что нам нужно только один элемент, и это первый пункт, так что вы можете пересмотреть как:
import subprocess
import re
p = subprocess.Popen('netsh interface show interface',stdout=subprocess.PIPE)
[x, err] = p.communicate()
## This gets the line-delimited list from stdout
items = x.split('\r\n')
## Now, we only need the fourth item in that list
itm = items[3]
## convert this to a delimited line for ease of processing:
itm = re.sub('\s\s+', '\t', itm)
## print to console
print(itm.split('\t')[-1])
Или, более кратко:
import subprocess
import re
p = subprocess.Popen('netsh interface show interface',stdout=subprocess.PIPE)
[x, err] = p.communicate()
## This gets the line-delimited list from stdout
items = x.split('\r\n')
"""
Now, we only need the fourth item in that list
convert this to a delimited line for ease of processing,
and finally print to console
This is a one-line statement that does what 3 lines did above
"""
print(re.sub('\s\s+', '\t', items[3]).split('\t')[-1])
у вас был шанс попробовать решение ниже? –
@DavidZemens да, и я все еще хотел пойти еще на один уровень. поэтому он работает по назначению, хотя, если у меня есть 4 интерфейса, и я просто хочу прочитать первый, что было бы лучшим способом сделать это? Я пробовал искать регулярное выражение, но не смог найти способ просто сохранить первую строку и удалить остальную часть результатов. Я изучаю программирование и стараюсь изо всех сил, прежде чем спрашивать. Пример: У меня есть ниже для подключения и просто хочу узнать имя первого соединения и удалить остальную часть из моего результата. Ethernet1 Ethernet2 Ethernet3 Ethernet4 – pylearner