with open('nasdaq.txt','r') as f: text = [l for l in f.read().splitlines()] text = text[9:] # get rid of include headers n = 20 # yours chunks are about this size # sort chunks into list of lists groups = [] for i in range(0, len(text), n): chunk = text[i:i+n] groups.append(chunk) # get rid of unwanted lists by keyword for ind,g in enumerate(groups): if any('nasdaq' in x for x in g): toss = groups.pop(ind)
如前所述, sed 是为这种东西而构建的,但你可以在python中使用这样的东西:
sed
with open('nasdaq.txt') as fin, open('nonasdaq.txt', 'w') as fout: for line in fin: if 'nasdaq' not in line: fout.write(line)
它只是循环输入文件的行,如果它们不包含字符串'nasdaq',则将它们复制到输出文件。
这应该符合你的需要,我想:
import re pat = '(?:^(?![\t ]*\r?\n).+\n)*?'\ '.*nasdaq.*\n'\ '(?:^(?![\t ]*\r?\n).+\n?)*' filename = 'to_define.txt' with open(filename,'rb+') as f: content = f.read() f.seek(0,0) f.write(re.sub(pat,'',content,flags=re.M)) f.truncate()
它只适用于部分实际上至少用空行分隔的情况(它可能是一行“\ n”或一行'\ t \ n',带有空格和制表符,无关紧要)
。
'(?:^(?![ \t]*\r?\n).+\n)*?'\ '.*nasdaq.*\n'\ '(?:^(?![ \t]*\r?\n).+\n?)*'
[\t ] 手段 的 一个字符,可以是制表符或空格 强> [\t ]* 手段 的 一个字符,可以是制表符或空格,重复0次或更多次 强> (?! 开始一个负面的先行断言 (?= 开始积极的先行断言 (?![\t ]*\r?\n) 手段 的 此位置后不得有以下序列:连续零个或多个'空格或制表符',字符\ r \ n(可能不存在)和字符换行符\ n 强> 当我使用“位置”一词时,它表示两个字符之间的位置。 断言意味着从它所处的位置开始。 在上面的RE中,负向前瞻断言放在符号后面 ^ 意思是 的 在一行的第一个字符之前的位置 强> 。 所以上面的断言,就像它所放置的那样,意味着: 的 从位于一行开头的位置开始,一定不能有序列 0 or more tab/blank-potential \r-\n 强> 。 注意符号 ^ 意思是“开始 的 线 强> “只有旗帜 re.MULTILINE 被激活了。
[\t ]
[\t ]*
(?!
(?=
(?![\t ]*\r?\n)
^
0 or more tab/blank-potential \r-\n
re.MULTILINE
现在部分RE (?! *\r?\n) 位于以下RE内: (?:^.+\n)*? 一般, (...) 定义一个捕获组。 投入的后果 ?: 在parens之间的开始是这些parens不再定义捕获组。但 (?:......) 是有用的定义RE。
(?! *\r?\n)
(?:^.+\n)*?
(...)
?:
(?:......)
这里 .+\n 手段 的 任何角色的继承(除了 \n )然后一个 \n 强> 。
.+\n
\n
和 ^.+\n (带国旗 re.M 激活)意味着 的 从一行的开头,除了换行符和换行符之外的任何字符的继承 强> 请注意,作为一个点 的 . 强> 匹配除了以外的任何字符 \n ,我们确信 .+ 不能匹配超出行的结尾的序列 \n 。 然后 ^.+\n 实际上定义了一条线!
^.+\n
re.M
.
.+
现在我们有什么? 有个 * 在取消捕获组之后。这意味着子串匹配 (?:^.+\n) 重复0次或更多次:也就是说我们匹配一连串的线。
*
(?:^.+\n)
但不是任何一条线,因为存在负面的先行断言,你现在知道它的意义。 那么,RE匹配的是什么 (?:^(?![\t ]*\r?\n).+\n)* 是: 的 一连串的线,其中没有空行 强> 。空行也是 \n 要么 `\t\t\n 要么 \t \t \n 等等(我不能代表一条只有空白的行,在srackoverflow上,但它也是空行)
(?:^(?![\t ]*\r?\n).+\n)*
`\t\t\n
\t \t \n
该RE末尾的问号意味着一旦接下来的RE,一个接一个地匹配这些非空行的正则表达式电机的进展必须停止。 以下RE是 .*nasdaq.*\n 意思是 的 一行中有“纳斯达克”这个词 强>
.*nasdaq.*\n
还有一些细微之处,但我会在这里停下来。 我认为其余部分对你来说也更容易理解。
如果一个部分是最后一个部分,并且其最后一行将包含nasdaq,则上述正则表达式不会捕获和删除它。 要纠正这个,那部分 .*nasdaq.*\n 必须更换 .*nasdaq.*(\n|\Z) 在其中 \Z 表示字符串的最后一部分。
.*nasdaq.*(\n|\Z)
\Z
我还在正则表达式中添加了一个部分来捕获每个部分后面的空行,因此清除了这些行的文件。
pat = '(?:^(?![\t ]*\r?\n).+\n)*?'\ '.*?nasdaq.*(\n|\Z)'\ '(?:^(?![\t ]*\r?\n).+\n?)*'\ '(?:[\t ]*\r?\n)*'