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

时间:2018-05-28 04:15:27

标签: 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 之外,代码适用于所有元素。当变量 i plutino 时,代码会打印 plutino plutino?的行。

1 个答案:

答案 0 :(得分:2)

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

更新:出于这样的原因,我也喜欢visual regex editors。它们可以让您轻松查看匹配内容和不匹配内容。

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