【发布时间】:2018-02-16 19:56:21
【问题描述】:
我有一个字符串(一个 DNA 序列)和一个正则表达式,用于过滤掉可能的匹配,(?:ATA|ATT)[ATCGN]{144,16563}(?:AGA|AGG|TAA|TAG)。后来我应用了两个过滤条件:
- 序列必须能被 3 整除,
len(match) % 3 == 0,并且 - 在字符串结尾
not any(substring in list(sliced(match[:-3], 3)) for substring in [x.replace("U", "T") for x in stop_codons])之前不能有终止密码子 (['AGA', 'AGG', 'TAA', 'TAG'])。
但是,当我应用这些过滤器时,我根本没有得到任何匹配项(在过滤器之前我得到大约 200 个匹配项。我在完整序列中搜索子字符串的方式是运行 re.findall(regex, genome_fasta, overlapped=True),因为匹配项可以是其他匹配的子匹配。
我对正则表达式有什么误解吗?据我所知,在过滤器之后,我应该还有匹配项。
如果还有什么我需要补充的,请告诉我! (我使用 Python 3.4 的 regex 包,而不是标准的 re 包,因为它不支持重叠)。
编辑 1:
根据评论:我正在寻找线粒体基因组中的 ORF,但只考虑长度至少为 150 个核苷酸(字符)的 ORF。考虑重叠很重要,因为匹配可能包括字符串中的第一个起始密码子和字符串中的最后一个终止密码子,但中间可能有另一个起始密码子。例如:
- 鉴于“ATAAAGCCATTTACCGTACATAGCACATTATAACCAACAAACCTACCCACCCTTAACTAG”,匹配项应该是“ATAAAGCCATTTACCGTACATAGCACATTATAACCAACAAACCTACCCACCCTTAACTAG”,但也应该是“ATAAAGCCATTTACCGTACATAGCACATTATAA”,因为“TAG”和“TAA”都是终止密码子。
编辑 2:
完全误解了评论,方法的完整代码是:
typical_regex = r"%s[ATCGN]{%s,%s}%s" % (proc_start_codons, str(minimum_orf_length - 6), str(maximum_orf_length - 6), proc_stop_codons)
typical_fwd_matches = []
if re.search(typical_regex, genome_fasta, overlapped=True):
for match in re.findall(typical_regex, genome_fasta, overlapped=True):
if len(match) % 3 == 0:
if not any(substring in list(sliced(match[:-3], 3)) for substring in [x.replace("U", "T") for x in stop_codons]):
typical_fwd_matches.append(match)
print(typical_fwd_matches)
typical_fwd_matches 数组为空,正则表达式在打印到控制台/文件时呈现为 (?:ATA|ATT)[ATCGN]{144,16563}(?:AGA|AGG|TAA|TAG)。
【问题讨论】:
-
给出例子,而不是代码谈话。另外,重叠是什么意思??
-
@sin 我的错!添加了示例并澄清了重叠。让我知道我是否应该添加更多!
-
我认为 sln 要求您显示一些代码。您在告诉我们您认为自己在做什么,但没有显示代码,因此我们可以验证您是否在做您认为自己在做的事情。您能否向我们展示一个将正则表达式 @ 过滤器应用于此字符串的代码的简短完整示例?
-
我的最佳猜测
(?=((?:ATA|ATT)(?:(?!AGA|AGG|TAA|TAG)[ATCGN]{3})+))其中 $1 包含该项目。而且,标准重新做到了这一点。 -
@Gerrat 添加了另一条评论,抱歉!罪我不知道在这种情况下你所说的 $1 是什么意思?
标签: regex python-3.4 string-matching dna-sequence