这是什么意思?关于 Python 正则表达式

what does it mean? about Python regular expression

上次我的问题是, (How can I get contents between square brackets by using regular expression?)

#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)

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

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

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

x in enumerate(matches)

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

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

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

字符串 \[([^\]]+) 是一个正则表达式模式,它匹配文字 [ 字符(用反斜杠转义,否则括号有特殊含义,我们稍后会看到),后跟一个捕获组 (...),其中包含来自特定 "character class" [...] 的一个或多个 ...+ 个字符(这是方括号的另一个含义!)。此字符 class 被取反 ^...,因此它匹配任何 而非 ],右括号。 (实际上不需要转义右括号的反斜杠,因为 [^] 不是有效字符 class。使用 [^]][^\]] 一样有效。包括反斜杠是虽然无害。)

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

另一件让您感到困惑的事情是 for ind, x in enumerate(matches)(我截取的代码比您截取的代码稍大)。 enumerate 函数接受一个可迭代参数和 returns 一个产生 index, item 个二元组的迭代器。每个元组的第一个值是一个整数,(默认情况下)从零开始并逐一递增。第二个值是来自给定 enumerate.

的可迭代对象的值

for 循环将元组中的值解压缩到名为 indx 的变量中,它在别处使用这些变量为将进入输出的每一行构建字符串.索引号 ind 用于生成 g1g2 名称,而不是从文件中解析它们。只要每个文件中的基因编号严格按顺序排列就可以了。