如何在与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。当变量i为plutino时,代码将打印plutino和plutino?的行 发生这种情况是因为plutino是plutino?的子字符串,因此正则表达式解析器匹配plutino?的第一部分,并返回一个非错误的答案。如果不需要做大量额外的工作,您应该能够用
re.search(i,line+r'\s')
解决这个问题,这意味着您需要在正在搜索的短语后面有一个空白字符。随着文件变得越来越长、越来越复杂,您可能会有更多这样的异常,以使正则表达式按需要运行
更新:我也喜欢这样的原因。它们使我们很容易看到哪些匹配,哪些不匹配
另一个选项是
i==line.split('|')[2].strip()
,它提取您似乎关心的文件部分。.strip()
方法在长行上可能会变得效率低下,但这可能适合您的使用情况。字符串中的?
正在产生问题。您需要一种机制来精确匹配该字符串。您可以执行ind=i.index('?');i=i[:ind]+“\\”+i[ind:
在字符串中追加\`以便在搜索中将`?
作为实际字符。请不要将对象命名为列表
!你真的重新打开了列表中每个世界的文件吗?最后,当代码没有“匹配后打印行”时,该代码如何“正常工作”?