0

上次我的问题是,如何使用正则表达式获取方括号之间的内容?

#start gene g1
dog1
dog2
dog3
#protein sequence = [DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD]
#end gene g1
###
#start gene g2
cat1
cat2
cat3
#protein sequence = [CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
#CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC]
#end gene g2
###
#start gene g3
pig1
pig2
pig3
...

我想获取括号之间的内容并制作名为 50267.fa 的新文件,如下所示

>g1_50267
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
>g2_50267
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 
CCCCCCCCCCCCCCCCCCCC
...

我得到了这样的答案,

import re

with open("50267.gff", "r") as ff:
    matches = re.findall(r'\[([^\]]+)', ff.read())
    matches = ['>g' + str(ind+1) + "_50267\n" + x.replace('\n#', ' ') for ind, x in enumerate(matches)]
#print(matches)
with open('50267.fa', 'w') as fa:
    fa.write("\n".join(matches))

当我尝试使用该代码时,它运行良好。但我不明白下面的代码是什么意思

r'\[([^\]]+)'
x in enumerate(matches)
4

2 回答 2

2

让我们看看你被混淆的两件事。

第一:r'\[([^\]]+)'。这是一个原始字符串文字 ( r'...')。在这种情况下,“原始”只是意味着 Python 的编译器不会将反斜杠解释为转义序列的一部分,它们被保留为实际的反斜杠字符。这很重要,因为正则表达式语言也在其自己的转义序列中使用反斜杠,这就是我们想要的。

该字符串\[([^\]]+)是一个正则表达式模式,它匹配一个文字[字符(用反斜杠转义,因为括号有特殊含义,我们稍后会看到),后跟一个捕获组(...),其中包含...+来自特定“字符类”的一个或多个字符" [...](这是方括号的另一个含义!)。这个字符类是 negated ^...,所以它匹配任何不是 ]的东西,一个右括号。(实际上不需要转义右括号的反斜杠,因为[^]它不是有效的字符类。使用[^]]效果和 . 一样好[^\]]。但包括反斜杠是无害的。)

因此,该模式匹配以左方括号开头的输入,然后捕获后面的一个或多个字符,只要它们不是右括号即可。

您感到困惑的另一件事是for ind, x in enumerate(matches)(我剪掉的代码比您做的要大一些)。该enumerate函数接受一个可迭代的参数并返回一个产生index, item两个元组的迭代器。每个元组的第一个值是一个整数,从零开始(默认情况下)并逐个递增。第二个值是来自给定的迭代的值enumerate

for循环将元组中的值解包到名为indand的变量x中,它在其他地方使用它来为将进入输出的每一行构建字符串。索引号ind用于生成g1,g2名称,而不是从文件中解析它们。只要每个文件中的基因编号是严格连续的,那应该没问题。

于 2017-11-28T04:44:35.480 回答
-1

用于匹配字符串中的字符组合。以上图案表示

r'\[([^\]]+)'可以在此处找到此模式 ( ) 的详细说明。

https://regex101.com/r/hSf8Up/1

x in enumerate(matches)

上面的代码只是遍历通过 RegEx 模式找到的匹配项。

于 2017-11-28T04:25:28.320 回答