我在文件中有很多行,我想匹配行中的某些模式,然后将该行写入具有匹配模式的更新内容的新文件。我测试了一行(包含在脚本中),所以我想匹配以数字开头的行,如果它是1,我想被替换为1 / 1,0替换为0/0,我设法匹配模式,但当我使用
line = ' '.join(line)
print line
它炸毁了整个控制台,在每一行打印出数百行一次包含一个字符,你能否提供一些关于如何正确连接这些元素并正确地将它写在新行中的提示?
import re
line = "gi|393925858|gb|AGTA02071966.1| 739 . G A 121.2 PASS NS=74;AN=2;DP=8448 GT:DP:GQ:EC:SG 0/1:262:99:116:R 1:32:93:32:A 0:87:42:72:R .:0:0:0:. .:0:0:0:. 0/1:222:99:113:R"
line = line.split()
for i in line:
matches = re.match(r'0(:\d+:\d+:\d+:[.|\w])', i)
if matches:
matches = i.replace('0', '0/0')
else:
matches = re.match(r'1(:\d+:\d+:\d+:[.|\w])', i)
if matches:
matches = i.replace('1', '1/1')
line = ' '.join(line)
print line
答案 0 :(得分:1)
您正在通过线路部分运行的for循环内调用line = ' '.join(line)
。因此,该线分为15个部分,您将重新加入并打印15次。
我认为你命名的方式使得不太清楚发生了什么,你有几个地方用一些完全不同的东西覆盖一个变量,或者不使用你所做的事情的结果。
我已经重写了一点,以便更清楚地说明它将线分成几部分,经过各部分,然后保存部分不变或改变,然后建立输出。
尝试:
import re
line_in = "gi|393925858|gb|AGTA02071966.1| 739 . G A 121.2 PASS NS=74;AN=2;DP=8448 GT:DP:GQ:EC:SG 0/1:262:99:116:R 1:32:93:32:A 0:87:42:72:R .:0:0:0:. .:0:0:0:. 0/1:222:99:113:R"
line_parts = line_in.split()
output_parts = []
for part in line_parts:
output_part = part
matches = re.match(r'0(:\d+:\d+:\d+:[.|\w])', part)
if matches:
output_part = part.replace('0', '0/0')
else:
matches = re.match(r'1(:\d+:\d+:\d+:[.|\w])', part)
if matches:
output_part = part.replace('1', '1/1')
output_parts.append(output_part)
line_out = ' '.join(output_parts)
print line_out
NB。这些线条原本在两个部分之间有四个空格,如果重要的话,你将用一个空间重新连接它们。 (我怀疑这些字段最初是以制表符分隔的字段,而不是四个空格,并且可能会更好地使用csv
模块阅读,除非您确定数据本身中没有任何空格。)
修改强>
我认为通过一些调整会更清楚:
thing_pattern
,因为我不知道1:32:93:32:A
代表什么概念。那怎么样:
import re
line_in = "gi|393925858|gb|AGTA02071966.1| 739 . G A 121.2 PASS NS=74;AN=2;DP=8448 GT:DP:GQ:EC:SG 0/1:262:99:116:R 1:32:93:32:A 0:87:42:72:R .:0:0:0:. .:0:0:0:. 0/1:222:99:113:R"
thing_pattern = r'(:\d+:\d+:\d+:[.|\w])'
line_parts = line_in.split()
output_parts = []
for part in line_parts:
output_part = part
if re.match('0'+thing_pattern, part):
output_part = part.replace('0', '0/0')
elif re.match('1'+thing_pattern, part):
output_part = part.replace('1', '1/1')
output_parts.append(output_part)
line_out = ' '.join(output_parts)
print line_out
答案 1 :(得分:1)
您必须将中间结果存储在另一个列表中,最后您可以加入该临时列表以获取结果,例如
line, temp = line.split(), []
for i in line:
matches = re.match(r'0(:\d+:\d+:\d+:[.|\w])', i)
if matches:
matches = i.replace('0', '0/0')
else:
matches = re.match(r'1(:\d+:\d+:\d+:[.|\w])', i)
if matches:
matches = i.replace('1', '1/1')
else:
matches = i
temp.append(matches)
line = ' '.join(temp)