拆分行中的元素,如何使用更新的值重新加入它们

时间:2014-03-23 03:26:01

标签: python regex

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

2 个答案:

答案 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代表什么概念。
  • 您没有使用“匹配”#39;变量,所以你真的不需要存储它
  • 一部分不会匹配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

答案 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)