gpt4 book ai didi

python - 分割行中的元素,如何用更新后的值重新连接它们

转载 作者:行者123 更新时间:2023-12-01 05:20:02 25 4
gpt4 key购买 nike

我在一个文件中有很多行,我想匹配行中的某些模式,然后将该行写入一个新文件,其中包含模式匹配的更新内容。我用一行(包含在脚本中)进行了测试,所以我想匹配以数字开头的行,如果是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

最佳答案

您正在对行部分运行的 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

注意。这些线条最初在各部分之间有四个空格,如果重要的话,您可以用一个空格重新连接它们。 (我怀疑这些字段最初是制表符分隔的字段,而不是四个空格,并且使用 csv 模块可能会更好地读取,除非您确定数据本身不存在任何空格)。

编辑

我认为稍微调整一下会更清楚:

  • 正则表达式模式重复。给它一个变量,其名称描述了它正在寻找的内容。我将其命名为 thing_pattern,因为我不知道 1:32:93:32:A 代表什么概念。
  • 您没有使用“matches”变量,因此您实际上不需要存储它
  • 一个部分不会同时匹配 1... 和 0...

那么怎么样:

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

关于python - 分割行中的元素,如何用更新后的值重新连接它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22586688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com