正则表达式可选捕获组(?)无法匹配预期内容问题求助
正则匹配问题解决
问题原因
你的正则表达式使用了贪婪模式的.+,它会尽可能匹配最长的字符序列,导致即使存在颜色码,也会被前面的.+完全覆盖,最后一个可选捕获组自然匹配不到内容。
修正后的正则
将贪婪匹配改为非贪婪匹配,同时按表格列的结构精准匹配,避免跨列过度匹配。适配你表格结构的正则如下:
r'\|\s+VLAN(\d+)\s+\|.*?\|.*?\|.*?\|.*?\|(VLAN\d+_[0-9A-Za-z]+)\s+\|.*?\|(?:@(#[\dA-Fa-f]{6}):?)?\s*\|'
正则说明
\|\s+VLAN(\d+)\s+\|:匹配第一列的VLAN编号,提取数字部分.*?\|.*?\|.*?\|.*?\|:非贪婪匹配中间4列内容(LAB标识、Labor描述、重复VLAN号、子网段)(VLAN\d+_[0-9A-Za-z]+)\s+\|:提取第六列的主机名.*?\|:非贪婪匹配第七列的状态标识内容(?:@(#[\dA-Fa-f]{6}):?)?\s*\|:可选匹配第八列的颜色码,仅捕获#开头的6位十六进制码,忽略前缀@和后缀冒号
测试结果
对给出的两行字符串匹配后:
- 第一行返回:
('56', 'VLAN56_LAB06', None) - 第二行返回:
('57', 'VLAN57_LAB07', '#848484')
内容的提问来源于stack exchange,提问作者pingu
相关产品推荐
相关产品推荐

