如何在与python精确匹配字符串模式后打印文件的行?

如何在与python精确匹配字符串模式后打印文件的行?,python,Python,我有一张单子 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

我有一张单子

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。当变量iplutino时,代码将打印plutinoplutino?的行

发生这种情况是因为plutinoplutino?的子字符串,因此正则表达式解析器匹配plutino?的第一部分,并返回一个非错误的答案。如果不需要做大量额外的工作,您应该能够用
re.search(i,line+r'\s')
解决这个问题,这意味着您需要在正在搜索的短语后面有一个空白字符。随着文件变得越来越长、越来越复杂,您可能会有更多这样的异常,以使正则表达式按需要运行

更新:我也喜欢这样的原因。它们使我们很容易看到哪些匹配,哪些不匹配


另一个选项是
i==line.split('|')[2].strip()
,它提取您似乎关心的文件部分。
.strip()
方法在长行上可能会变得效率低下,但这可能适合您的使用情况。

字符串中的
正在产生问题。您需要一种机制来精确匹配该字符串。您可以执行
ind=i.index('?');i=i[:ind]+“\\”+i[ind:
在字符串中追加
\`以便在搜索中将`?
作为实际字符。请不要将对象命名为
列表
!你真的重新打开了
列表中每个世界的文件吗?最后,当代码没有“匹配后打印行”时,该代码如何“正常工作”?