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

2024-05-15 13:37:13 发布

您现在位置: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   |    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的行?。你知道吗


Tags: 代码inbr元素forirlinerr
1条回答
网友
1楼 · 发布于 2024-05-15 13:37:13

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

更新:出于这样的原因,我也喜欢visual regex editors。它们使我们很容易看到什么匹配什么不匹配

另一种选择是i==line.split('|')[2].strip(),它提取您似乎关心的文件部分。.strip()方法在长线上可能会变得低效,但这可能适合您的用例。你知道吗

相关问题 更多 >