这是什么意思?关于 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
循环将元组中的值解压缩到名为 ind
和 x
的变量中,它在别处使用这些变量为将进入输出的每一行构建字符串.索引号 ind
用于生成 g1
、g2
名称,而不是从文件中解析它们。只要每个文件中的基因编号严格按顺序排列就可以了。
上次我的问题是, (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
循环将元组中的值解压缩到名为 ind
和 x
的变量中,它在别处使用这些变量为将进入输出的每一行构建字符串.索引号 ind
用于生成 g1
、g2
名称,而不是从文件中解析它们。只要每个文件中的基因编号严格按顺序排列就可以了。