2017-10-11 31 views
0

我正在尝试扫描输入文件并打印出以某个字符串开头的部分行。该文本文件是10000多行,但我只关心起始行,更具体地说是该行内的数据。澄清,这里有两行代码解释了我想说的。打印出以两个不同的字符串输出开头的行吗?

inst "N69" "IOB",placed BIOB_X11Y0 R8 , 

inst "n0975" "SLICEX",placed CLEXL_X20Y5 SLICE_X32Y5 , 

这里是我得到迄今代码:

searchfile = open("C:\PATH\TO\FILE.txt","r") 
for line in searchfile: 
    if "inst " in line: 
     print line 
searchfile.close() 

现在,这是巨大的,如果我在寻找与“出师表”开始的所有行,但我专门找以“inst”N“”或“inst”n“”开头的行。从那里,我想只提取以N或n开头的字符串。

我的想法是首先将这些行(如上所示)提取到一个新的.txt文件,然后运行另一个脚本以仅获取具有N或n的行的部分。在上面的例子中,我只关心N69和n0975。有没有更简单的方法来做到这一点?

+0

为什么你觉得你需要两个脚本和一个中间文件?你可以在第二个脚本中做任何事情,你可以在第一个脚本中执行(在if中)。 – jasonharper

+0

抱歉@jasonharper我的Python知识有点生疏,想不到另一种方法。不要让我开始对我的正则表达式完全缺乏了解... –

回答

1

随着re.search()功能:

样品file.txt内容:

inst "N69" "IOB",placed BIOB_X11Y0 R8 , 
some text 
inst "n0975" "SLICEX",placed CLEXL_X20Y5 SLICE_X32Y5 , 
text 
another text 

import re 

with open('file.txt', 'r') as f: 
    for l in f.read().splitlines(): 
     m = re.search(r'^inst "([Nn][^"]+)"', l) 
     if m: 
      print(m.group(1)) 

输出:

N69 
n0975 
+0

但如何删除n或N值 –

+0

@nice_remark后面的多余数据,请参阅我的更新 – RomanPerekhrest

+0

试图将其写入文本文件时,数据不会像您的代码输出一样逐行列出。会添加'file.write(m.group(1))'这一行吗? –

1

是与re MOD ULE。

re.finditer(r'^inst\s+\"n(\d+)\"', the_whole_file, re.I) 

会返回所有匹配的迭代器。 对于每场比赛,你需要做.group(1)来获得你想要的数字。

请注意,您不需要使用此方法首先过滤文件。你可以为整个文件做这个。

在你的情况下的输出将是:

69 
0975 
0

这里是一个解决方案:

with open('nfile.txt','r') as f: 
    for line in f: 
     if line.startswith('inst "n') or line.startswith('inst "N'): 
      print line.split()[1] 

对于文件startswith部分检查每个线路如果线路与目标patters中的一个开始。如果是,则使用split拆分该行并打印第二个组件,该组件是nN的零件。

相关问题