如何修改正则表达式以提取字典中排除SN和MAC标识的注释内容?
解决方案:移除SN和MAC相关内容提取目标文本
我来帮你搞定这个需求,不管是调整正则表达式,还是用更直观的非正则方法,都能实现你要的效果,具体看哪种更适合你的场景:
一、修改正则表达式的两种思路
1. 精准提取最后一行(如果目标内容总是在末尾)
你的原正则会匹配第一个换行后的所有内容,我们可以调整成只匹配最后一行的内容,这样不管中间有没有MAC那行,都能直接拿到目标日期文本:
import re test1 = {"SN": "SN: abc123\r\nMAC: 10:ab:cd:30:5C:7C\r\n01-04-2022 Замena"} name_match_3 = re.search(r"\r\n([^\r\n]+)$", test1.get("SN")) dict_miner_regular = {"Comment": name_match_3.group(1) if name_match_3 else None}
这里的正则\r\n([^\r\n]+)$解释:
\r\n匹配换行符,定位到行的开头([^\r\n]+)捕获除换行外的所有字符(也就是整行内容)$匹配字符串结尾,确保只拿到最后一行
2. 替换掉所有SN/MAC开头的行(更灵活)
如果目标内容不一定在最后,只是要移除所有和SN、MAC相关的行,可以用re.sub来批量替换掉这些行,剩下的就是你要的内容:
import re test1 = {"SN": "SN: abc123\r\nMAC: 10:ab:cd:30:5C:7C\r\n01-04-2022 Замena"} cleaned_comment = re.sub(r"^(SN:|MAC:).*\r?\n", "", test1.get("SN"), flags=re.MULTILINE).strip() dict_miner_regular = {"Comment": cleaned_comment if cleaned_comment else None}
^(SN:|MAC:).*\r?\n:匹配以SN:或MAC:开头的整行(包括换行符)re.MULTILINE:让^匹配每行的开头,而不是整个字符串的开头.strip():处理替换后可能残留的首尾空白
二、非正则的替代方法(更直观)
如果觉得正则不好理解,也可以用字符串分割+过滤的方式,可读性更强:
test1 = {"SN": "SN: abc123\r\nMAC: 10:ab:cd:30:5C:7C\r\n01-04-2022 Замena"} # 按行分割字符串 lines = test1.get("SN").splitlines() # 过滤掉以SN:或MAC:开头的行 filtered_lines = [line for line in lines if not line.startswith(("SN:", "MAC:"))] # 拼接成最终的注释内容 cleaned_comment = "\n".join(filtered_lines).strip() dict_miner_regular = {"Comment": cleaned_comment if cleaned_comment else None}
这种方法逻辑清晰,就算以后字符串结构有小变化,也容易调整过滤条件。
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

