我有一个清单
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?打印行。
最佳答案
发生这种情况是因为plutino是plutino?的子字符串,所以正则表达式解析器匹配plutino?的第一部分吗?并返回非虚假答案。无需进行大量额外工作,您应该可以使用re.search(i, line+r'\s')
解决问题,该问题表示您要在搜索的短语后面添加一个空格字符。随着文件变得越来越长,越来越复杂,您可能会遇到更多此类异常,以使正则表达式表现出所需的行为。
更新:由于这样的原因,我也喜欢visual regex editors。它们使查看哪些匹配项和哪些不匹配项变得容易。
另一个选择是类似于i==line.split('|')[2].strip()
的内容,它会提取文件中您似乎关心的部分。 .strip()
方法在长行上可能会变得效率低下,但这可能适合您的用例。