Почему я не могу выполнить регулярное выражение для этой "строки", возвращаемой этим методом модуля подпроцесса? - PullRequest
0 голосов
/ 07 февраля 2020

Я довольно новичок в Python, и я нахожу некоторые проблемы с regex

В программе, над которой я работаю, у меня есть следующие строки кода:

ifconfig_result = subprocess.check_output(["ifconfig", options.interface])
print(ifconfig_result)

mac_address_search_result = re.search(r"\w\w:\w\w:\w\w:\w\w:\w\w:\w\w", ifconfig_result)
print(mac_address_search_result.group(0))

В первой строке выполняется команда ifconfig в системе Linux (с использованием модуля подпроцесса). Затем я печатаю этот вывод, я получаю этот вывод:

b'eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500\n        inet 192.168.223.128  netmask 255.255.255.0  broadcast 192.168.223.255\n        inet6 fe80::20c:29ff:feb9:fdf6  prefixlen 64  scopeid 0x20<link>\n        ether 00:0c:29:b9:fd:f6  txqueuelen 1000  (Ethernet)\n        RX packets 69731  bytes 94090876 (89.7 MiB)\n        RX errors 0  dropped 0  overruns 0  frame 0\n        TX packets 31405  bytes 3383293 (3.2 MiB)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n\n'

Затем я пытаюсь использовать регулярное выражение для извлечения только адреса MA C, содержащегося в этой возвращенной «строке» (я думаю, что это не является строкой пропптера).

Проблема в том, что в этой строке выполняется регулярное выражение:

mac_address_search_result = re.search(r"\w\w:\w\w:\w\w:\w\w:\w\w:\w\w", ifconfig_result)

Я получаю следующее исключение:

Traceback (most recent call last):
  File "mac_changer.py", line 46, in <module>
    mac_address_search_result = re.search(r"\w\w:\w\w:\w\w:\w\w:\w\w:\w\w", ifconfig_result)
  File "/usr/lib/python3.7/re.py", line 183, in search
    return _compile(pattern, flags).search(string)
TypeError: cannot use a string pattern on a bytes-like object

Итак, Мне кажется, что объект ifconfig_result, возвращаемый методом check_output () объекта subprocess , - это не строка, а что-то вроде двоичного (что именно)

Почему есть ли у меня такое поведение? (Я следую учебному пособию, в котором он проиллюстрирован таким образом).

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

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Ваша проблема в том, что у вас есть не str, а bytes.

Либо вы конвертируете его в str

mac_address_search_result = re.search(r"\w\w:\w\w:\w\w:\w\w:\w\w:\w\w", ifconfig_result.decode("utf8"))

, либо вы используете bytes matcher

mac_address_search_result = re.search(rb"\w\w:\w\w:\w\w:\w\w:\w\w:\w\w", ifconfig_result)
1 голос
/ 07 февраля 2020

"Литералы байтов всегда начинаются с префикса 'b' или 'B'; они создают экземпляр типа байтов вместо типа str. Они могут содержать только символы ASCII; байты со значением цифры c, равным 128 или больше должно быть выражено с помощью escape-символов. "

Что символ 'b' делает перед строковым литералом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...