【问题标题】:How to fix "TypeError: cannot use a string pattern on a bytes-like object"?如何修复“TypeError:不能在类似字节的对象上使用字符串模式”?
【发布时间】:2020-02-11 04:38:05
【问题描述】:

我正在为 linux 编写一个查看 mac 地址的简单程序。我的程序应该查看“ifconfig”并使用正则表达式仅提取 MAC 地址。

import subprocess
import re

print('This program will only look at the mac address.')
print('Enter your interface.(for example: wlan0))')
interface = input(': ')
find_mac = subprocess.check_output(["ifconfig", interface], shell=True)
mac_clean = re.search(r"\w\w:\w\w:\w\w:\w\w:\w\w\:\w\w", find_mac)
print(mac_clean.group(0))`

我希望的输出是MY:MAC:ADDRESS,但实际输出是

mac_clean = re.search(r"\w\w:\w\w:\w\w:\w\w:\w\w:\w\w", find_mac)
搜索中的文件“/usr/lib/python3.7/re.py”,第 183 行
return _compile(pattern, flags).search(string)
TypeError: cannot use a string pattern on a bytes - like object

【问题讨论】:

    标签: python


    【解决方案1】:

    subprocess.check_output 的结果是字节,你需要一个字符串才能工作

    mac_clean = re.search(r"\w\w:\w\w:\w\w:\w\w:\w\w\:\w\w", find_mac.decode())
    

    您可以使用bytes.decode 解码字节

    您也可以通过psutils 轻松获得它,请参阅此帖子link

    【讨论】:

    • 如果我输入eth0或lo,程序显示wlan0的MAC地址。如何解决?我把 .decode()
    • 我不会催你,但请尽快提供帮助。谢谢
    【解决方案2】:

    首先,将 find_mac 转换为字符串。

    
    find_mac = subprocess.check_output(["ifconfig", interface], shell=True).decode()
    
    

    然后,对于您在正则表达式中的模式。

    
    mac_clean = re.search(r"^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$", find_mac)
    
    

    一些关于正则表达式的教程和文档:

    编辑:根据@Reznik 评论纠正错误

    Edit1:修复正则表达式

    【讨论】:

    • str 上的字节对象会返回一个b'string',这里需要decode
    • 感谢您这么快。你能给一个链接来学习这个材料吗?
    • 是的。非常感谢
    • @kali_xyyali 我已经用一些文档、教程、教程更新了帖子。
    猜你喜欢
    • 2016-06-03
    • 2014-02-21
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    相关资源
    最近更新 更多