我有一个清单

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()方法在长行上可能会变得效率低下,但这可能适合您的用例。

09-27 08:29