如何用Python精确匹配字符串并打印文件中匹配行的下一行?
解决正则模糊匹配的问题
首先,咱们先明确你的需求:你有一个包含各类天体类型的列表,想要在目标文件中精确匹配每个列表元素,然后打印匹配行的下一行。但目前的代码在搜索plutino时,会把plutino?也一起匹配出来,这显然不是你想要的结果。
先梳理下你的基础信息:
搜索列表
search_list = ['plutino?','res 2:11','Uranus L4','res 9:19','damocloid','cubewano?','plutino']
(这里提醒下:别用list当变量名,它是Python的内置类型,容易引发意外问题)
目标文件内容
1995QY9 | 1995_QY9 | plutino | 32929 | | 39.445 | 0.260 | 29.193 | 49.696 | 4.8 | 66 | # 0.400 | 1.21 BR-U | ? 1997CU29 | 1997_CU29 | cubewano | 33001 | | 43.534 | 0.039 | 41.815 | 45.253 | 1.5 | 243 | | 1.82 RR | 1998BU48 | 1998_BU48 | Centaur | 33128 | | 33.363 | 0.381 | 20.647 | 46.078 | 14.2 | 213 | # 0.052 | 1.59 RR | ? 1998VG44 | 1998_VG44 | plutino | 33340 | | 39.170 | 0.250 | 29.367 | 48.974 | 3.0 | 398 | # 0.028 | 1.51 IR | 1998SN165 | 1998_SN165 | inner classic | 35671 | | 37.742 | 0.041 | 36.189 | 39.295 | 4.6 | 393 | # 0.060 | 1.13 BB | 2000VU2 | 2000_VU2 | unusual | 37117 | Narcissus | 6.878 | 0.554 | 3.071 | 10.685 | 13.8 | 11 | # 0.088 | | 1999HX11 | 1999_HX11 | plutino? | 38083 | Rhadamanthus | 39.220 | 0.151 | 33.295 | 45.144 | 12.7 | 168 | | 1.18 BR | 1999HB12 | 1999_HB12 | res 2:5 | 38084 | | 56.376 | 0.422 | 32.566 | 80.187 | 13.1 | 176 | | 1.39 BR-IR |
当前代码的问题
你现在用的re.search(i, line)是模糊匹配逻辑,只要行内包含i的子串就会命中。比如plutino是plutino?的子串,自然会被匹配到;而且你的列表里有plutino?,这里的?在正则里是特殊字符(表示前面的字符可选),所以搜索plutino?时,甚至会匹配plutino或者plutin,完全偏离了精确匹配的需求。
解决方案1:精确匹配字段(最稳妥)
因为你的文件每行是用|分隔的,第三列正好是咱们要匹配的类型字段,直接分割行取出第三列做精确对比就好,完全不需要正则,简单又可靠:
search_list = ['plutino?','res 2:11','Uranus L4','res 9:19','damocloid','cubewano?','plutino'] # 先把所有行读入内存,方便后续获取下一行 with open("tnolist.txt") as f: lines = f.readlines() for item in search_list: for idx, line in enumerate(lines): # 分割行,同时去掉每个字段前后的空格 fields = [field.strip() for field in line.split('|')] # 确保字段数量足够,并且第三列和目标元素完全一致 if len(fields) >= 3 and fields[2] == item: # 检查是否有下一行,避免索引越界 if idx + 1 < len(lines): print(f"匹配到「{item}」,下一行内容:") print(lines[idx+1]) else: print(f"匹配到「{item}」,但这是最后一行,没有下一行")
解决方案2:正则精确匹配(如果一定要用正则)
如果坚持用正则,需要做两件事:
- 对列表中的特殊字符(比如
?、:)进行转义,避免被正则解析为语法符号; - 匹配字段的完整边界,确保只命中完全一致的内容。
代码如下:
import re search_list = ['plutino?','res 2:11','Uranus L4','res 9:19','damocloid','cubewano?','plutino'] with open("tnolist.txt") as f: lines = f.readlines() for item in search_list: # 转义正则特殊字符 escaped_item = re.escape(item) # 构建正则,匹配被|和空格包裹的完整字段 pattern = re.compile(rf'\| {escaped_item} \|') for idx, line in enumerate(lines): if pattern.search(line): if idx + 1 < len(lines): print(f"匹配到「{item}」,下一行内容:") print(lines[idx+1]) else: print(f"匹配到「{item}」,但这是最后一行,没有下一行")
内容的提问来源于stack exchange,提问作者Fredifqh
相关产品推荐
相关产品推荐

