Python从列表提取AR后指定序列遇问题,求正确实现方法
提取AR后BR_/R_开头的唯一序列
嘿,我看你是想从列表里提取AR之后、以BR_或R_开头的字母数字序列,还要生成唯一列表对吧?你之前的代码只是筛选了包含R_的整个列表元素,并没有提取你真正需要的子串,也没处理重复项,所以结果不对。下面是能解决问题的方案:
完整解决方案代码
import re LIST1 = ["AR BR_16_0138244", "AR # BR_16_0138254","AR BR_16_0138264, HHGG AR BR_16_0138264", "AR R_16_01382649" ,"AADSFG AR # R_16_01382679 AR # R_16_01382679"] # 正则匹配规则:找AR后面(可能带空格或#)的BR_/R_开头的完整序列 pattern = re.compile(r'AR\s*(?:#\s*)?(BR_\w+|R_\w+)') # 收集所有匹配到的目标子串 all_matches = [] for text in LIST1: # 找出当前文本里所有符合规则的子串 found_items = pattern.findall(text) all_matches.extend(found_items) # 去重且保持元素出现的顺序(Python3.7+可用) unique_results = list(dict.fromkeys(all_matches)) print(unique_results)
运行这段代码后,就能得到你想要的结果:["BR_16_0138244", "BR_16_0138254", "BR_16_0138264", "R_16_01382649", "R_16_01382679"]
代码细节解释
正则表达式说明:
AR\s*:匹配AR以及后面跟着的任意数量空格(包括没有空格的情况)(?:#\s*)?:处理AR和目标序列之间可能存在的#符号(可选,后面也可能带空格),用(?:...)是为了避免把#部分作为捕获组内容(BR_\w+|R_\w+):精准捕获以BR_或R_开头的完整序列,\w+会匹配后续的字母、数字和下划线,完全符合你给出的序列格式
收集匹配结果:
- 遍历列表中的每个字符串,用
findall一次性找出所有符合规则的子串,把它们都添加到all_matches列表里
- 遍历列表中的每个字符串,用
去重处理:
- 用
dict.fromkeys(all_matches)创建一个字典,字典的键会自动去重,而且Python3.7及以上的字典会保持键的插入顺序,最后把字典转成列表就能得到有序的唯一结果了
- 用
为什么你的原代码不符合预期?
你之前的列表推导式[x for x in LIST1 if re.search("R_", x)]只是把包含R_的整个列表元素筛选出来了,并没有提取出你需要的子串,而且也没有处理重复出现的序列,所以得到的结果是整个字符串的集合,不是你想要的子串列表。
内容的提问来源于stack exchange,提问作者Raghavan vmvs
相关产品推荐
相关产品推荐

