使用Regex过滤掉线条

时间:2017-02-08 12:28:01

标签: python regex

我的大标签分隔文件,前后有一些文字,EDITED

chr3Av1G678.1 chr2Bv1G678.9
chr1Av1G978.6 chr1Bv1G456.1
chr2Av1G123.4 chr2Bv1G678.3
chr1Av1G456.0 chr2Av1G784.22

如何从文件1A-1B和2A-2B过滤掉?这样我只有3A 2B和1A 2A

import re
import sys
f=open('input.txt','r') 
r=open('output.txt','w')
for line in f.readlines():
    line = line.split()
    if not (?) re.search(r'text1Av1', line[0]) and not (?) re.search(r'text1Bv1', line[1]):
        r.write("\t".join(line)+"\n")
f.close()
r.close() 

3 个答案:

答案 0 :(得分:1)

假设你想保留你有A或B数字的行,然后紧跟(例如在标签后)一个不同的数字后跟A或B,以下内容应该有效:

import re

with open('input.txt', 'r') as f:
    read_lines = f.readlines()

with open('output.txt', 'w') as o:
    for line in read_lines:
        get_digits = re.match(r'.*(\d)+[AB]\s+(\d)+[AB].*', line, re.DOTALL)
        if get_digits:
            if get_digits.group(1) != get_digits.group(2):
                o.writelines(line)

这将写入output.txt包含3A 2B1A 2A的行。

为了进一步概括,您可以将正则表达式更改为:

re.match(r'.*(\d)+[A-Z]\s+(\d)+[A-Z].*', line, re.DOTALL)

允许任何大写字母,而不仅仅是A和B.

答案 1 :(得分:1)

你可以这样做:

import re

with open('input', 'r') as f, open('output', 'w') as f2:
    ftemp = f.read()
    for a in range(1,4):
        res = '-'.join(sorted(set(re.findall(r'{}[A-Z]'.format(a), ftemp))))
        print res
        f2.write(res)

print res的输出:

1A-1B
2A-2B
3A

步骤:

使用要从文件中捕获的数字创建一个range()对象。然后在文件中搜索这些数字+ 1个大写字母。

答案 2 :(得分:1)

简单的解决方案,如果你想保留你的文字,只过滤掉两行。

更新正则表达式。

import re
import sys
with open('input.txt','r') as f, open('output.txt','w') as r:
    for line in f:
        if None is re.search(r'^chr[12]Av1G\d+\.\d+\s*chr[12]Bv1G\d+\.\d+$',line):
            r.write(line)