我有一个清单
list = ['plutino?','res 2:11','Uranus L4','res 9:19','damocloid','cubewano?','plutino']
我想搜索具有下一格式的文件中列表中的每个元素,并在匹配后打印该行
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 |
我正在使用下一个代码来执行该操作
for i in list:
with open("tnolist.txt") as f:
for line in f:
if re.search(i, line):
print(line)
除了 plutino 之外,代码适用于所有元素。当变量 i 为 plutino 时,代码会打印 plutino 和 plutino?的行。
答案 0 :(得分:2)
这是因为 plutino 是 plutino?的子字符串,所以正则表达式解析器匹配 plutino的第一部分?并返回非 - 回答。如果没有大量的额外工作,您应该能够使用re.search(i, line+r'\s')
解决问题,该问题表示您需要在搜索的短语后面加一个空白字符。随着文件变得越来越复杂,您可能会有更多此类异常,以使正则表达式按预期运行。
更新:出于这样的原因,我也喜欢visual regex editors。它们可以让您轻松查看匹配内容和不匹配内容。
另一种选择是i==line.split('|')[2].strip()
,它会提取您似乎关心的文件部分。 .strip()
方法在长行上可能效率低下,但这可能适合您的用例。