如何用re.findall匹配字符串中1位或2位数字的COM端口?
解决COM端口1位/2位数字的正则匹配问题
你之前的正则写法存在两个核心问题:
r'COM[0-9][0-9]'强制要求匹配两位数字,导致单数字的COM端口(比如COM4)被遗漏;r'COM[0-99]'是错误的字符组用法,字符组内的[0-99]等价于[0-9],只能匹配一位数字,自然抓不到COM12这类两位的端口。
正确的正则表达式
使用r'COM\d{1,2}'或者r'COM[0-9]{1,2}',其中{1,2}表示匹配前面的数字1次或2次,刚好覆盖你需要的COM4到COM99的范围。
修改后的代码片段
import re import serial.tools.list_ports ports = list(serial.tools.list_ports.comports()) for p in ports: print(p.description) if 'Serial Device' in p.description: find_com = re.findall(r'COM\d{1,2}', p.description) if find_com: # 取第一个匹配到的有效端口 target_port = find_com[0] print(f"找到目标串口: {target_port}") # 此处添加后续串口连接、数据接收逻辑
更可靠的替代方案
其实serial.tools.list_ports返回的ListPortInfo对象自带name属性,直接就是端口名(比如'COM4'),完全不需要从description里正则提取,这个方法更稳定,能避免不同设备description格式不一致导致的匹配失败:
import serial.tools.list_ports ports = list(serial.tools.list_ports.comports()) for p in ports: print(f"描述: {p.description}, 端口名: {p.name}") if 'Serial Device' in p.description: target_port = p.name print(f"找到目标串口: {target_port}") # 后续逻辑写在这里
内容的提问来源于stack exchange,提问作者Naj
相关产品推荐
相关产品推荐

