1

我正在尝试读取包含以相同模式开头但以不同数字结尾的字符串的文件。我想通过替换它们(用正则表达式)来缩短这些字符串并将它们写在不同的文件中。我试图使用 re.sub (我不想使用拆分)。

原始文件是这样的:

@C00127:132:CDTL1ACXX:11000(several digits...)
@C00127:132:CDTL1ACXX:55588(several digits...)
@C00127:132:CDTL1ACXX:99999(several digits...)

我的想法是编写一个新文件,其中包含字符串的保守模式(即“@C00127:132:CDTL1ACXX:”),后跟前5 个变量数字。所以我想了一个这样的脚本:

import re
general_ID = open("general_ID.txt", "w+")
x = raw_input('type the name of the fastq file that you wanna extract the IDs: ')
with open (x, 'rt') as myfile:   
    for line in myfile:
        general_ID.write(re.sub('@C00127:132:CDTL1ACXX:......+', '@C00127:132:CDTL1ACXX:.....', line))
general_ID.close()

当我运行这个脚本时,我的原始文件来自:

@C00127:132:CDTL1ACXX:11000(several digits...)
@C00127:132:CDTL1ACXX:55588(several digits...)
@C00127:132:CDTL1ACXX:99999(several digits...)
etc

像这样结束:

C00127:132:CDTL1ACXX:.....
C00127:132:CDTL1ACXX:.....
C00127:132:CDTL1ACXX:.....
etc
4

2 回答 2

1

您可以使用正则表达式

@C00127:132:CDTL1ACXX:(\d{5})

请参阅正则表达式演示。细节:

  • @C00127:132:CDTL1ACXX:- 文字文本
  • (\d{5})- 第一组:五位数

Python代码:

import re, os
x = input('type the name of the fastq file that you wanna extract the IDs: ')
if os.path.isfile(x):
    with open("general_ID.txt", "w") as general_ID:
        with open (x, 'r') as myfile:   
            for line in myfile:
                m = re.search(r'@C00127:132:CDTL1ACXX:(\d{5})', line)
                if m:
                    general_ID.write( "{}\n".format(m.group(1)) )
于 2020-06-25T18:43:01.220 回答
0

使用切片

不需要正则表达式来解决这个问题。前缀有固定长度;只取每行的固定长度切片。

id_len = 5
prefix_len = len("C00127:132:CDTL1ACXX:")
keep_len = prefix_len + id_len

with open("general_ID.txt", "w+") as general_ID:
    x = raw_input('type the name of the fastq file that you wanna extract the IDs: ')

    with open (x, 'rt') as myfile:   
        for line in myfile:
            general_ID.write("{}\n".format(line[:keeplen]))

一个有用的工具可能会接受要写出的每一行的长度。或者也许查看前几行来自动确定公共前缀的长度。

于 2020-06-26T00:27:14.057 回答