我的大标签分隔文件,前后有一些文字,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()
答案 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 2B
和1A 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)