2017-02-23 152 views
-1

Я использую следующий код в окнах:Python - Regex от свидания как-объект

hostname = Popen(['hostname'], stdout=PIPE, stderr=PIPE) 
stdout, stderr = process.communicate() 

print(stdout) 

regex = compile(b'('CO.*)') 

m = regex.match(stdout) 
if m != None: 
    print(m) 
else: 
    print("Doesn't match") 

Я получаю результат:

b'COMPUTER\r\n' 
<_sre.SRE_Match object; span=(0, 15), match=b'COMPUTER\r'> 

Я знаю, я могу использовать гораздо проще в этом случае (но по какой-то причине я не хочу использовать):

socket.gethostname() 

проблема заключается в том, что я не люблю весь вывод из матча регулярного выражения:

<_sre.SRE_Match object; span=(0, 15), match=b'COMPUTER\r'> 

Я не только COMPUTER.

Это возможно, без использования другого регулярного выражения?

+1

вы пробовали 'm.group (1) .decode ("ASCII")'? –

+0

Это брилиант !. Пожалуйста, разместите его как. ответ. – Fangir

ответ

1

При печати m вы получаете представление в sre объекта (для целей отладки)

Чтобы преодолеть незначительные сбои, чтобы добраться до строки, которую вы можете сделать:

m.group(1).decode("ascii").rstrip() 
  • извлечение группы из regex
  • декодирование на str (удалите префикс b)
  • и сдирать CR + LF завершающие символы из subprocess выхода
1

Это должно получить строку байта: m.group(1). Но для этой проблемы не используйте regex, это слишком много. Вместо этого используйте if stdout.startswith(b'CO'):

Ваше регулярное выражение содержит синтаксическую ошибку Python, вам не нужно компилировать регулярное выражение (re.match(b'(CO.*)', stdout) сделает это). Почему бы не использовать socket.gethostbyname()? Вы делаете что-то отличное от hostname в реальном коде?

+0

Да, 'hostname' это только для этого примера, мне придется использовать регулярное выражение, потому что я буду искать несколько переменных для чисел команд, а не только для системы. Но мне нравится '.startswith(). – Fangir