【发布时间】:2018-02-19 11:04:32
【问题描述】:
我特别关注 R、Perl 和 shell。但是任何其他编程语言也可以。
问题
有没有一种方法可以根据正则表达式直观地或以编程方式检查和索引匹配的字符串?这是为了在第二个正则表达式中引用回第一个正则表达式及其结果,以便能够修改匹配字符串的一部分并为该特定部分编写新规则。
https://regex101.com 确实可视化某个字符串如何匹配正则表达式。但它远非完美,对我庞大的数据集效率不高。
问题
我的第一个正则表达式有大约 12000 个匹配的字符串(DNA 序列),我想处理这些字符串,并根据一些严格的规则在第二个文件中找到与这 12000 个匹配项配合得很好的其他字符串严格的规定。
简化示例
这是贯穿我的第一个文本文件的第一个正则表达式(我的原始正则表达式的简化、较短版本)。
[ACGT]{1,12000}(AAC)[AG]{2,5}[ACGT]{2,5}(CTGTGTA)
假设它在我的大文本文件中找到以下三个子字符串:
1. AAACCCGTGTAATAACAGACGTACTGTGTA
2. TTTTTTTGCGACCGAGAAACGGTTCTGTGTA
3. TAACAAGGACCCTGTGTA
现在我有一个 第二个文件,其中包含一个非常大的字符串。从这第二个文件中,我只对提取与新的(第二个)正则表达式匹配的那些子字符串感兴趣,该正则表达式本身依赖于我在几个部分中的第一个正则表达式。 因此,第二个正则表达式必须考虑到第一个文件中匹配的子字符串,并查看它们如何与第一个正则表达式匹配!
为了简单起见,请允许我用这种方式索引我的第一个正则表达式以便更好地说明:
first.regex.p1 = [ACGT]{1,12000}
first.regex.p2 = (AAC)
first.regex.p3 = [AG]{2,5}
first.regex.p4 = [ACGT]{2,5}
first.regex.p5 = (CTGTGTA)
现在我的 第二个(新)正则表达式将搜索 第二个文本文件,并将取决于第一个正则表达式的结果(以及子字符串如何从第一个文件与第一个正则表达式匹配)将按以下方式定义:
second.regex = (CTAAA)[AC]{5,100}(TTTGGG){**rule1**} (CTT)[AG]{10,5000}{**rule2**}
这里 rule1 和 rule2 依赖于来自第一个文件的第一个正则表达式的匹配。因此;
rule1 = look at the matched strings from file1 and complement the pattern of first.regex.p3 that is found in the matched substring from file1 (the complement should of course have the same length)
rule2 = look at the matched strings from file1 and complement the pattern of first.regex.p4 that is found in the matched substring from file1 (the complement should of course have the same length)
您可以看到第二个正则表达式有属于自己的部分(即它们独立于任何其他文件/正则表达式),但它也有部分依赖于第一个文件的结果和第一个正则表达式的规则以及第一个文件中的每个子字符串如何匹配第一个正则表达式!
现在再次为简单起见,我使用 file1 中的第三个匹配子字符串(因为它比其他两个短)来向您展示第二个文件中可能的匹配项的外观以及它如何满足第二个正则表达式:
这是我们从第一个正则表达式运行到第一个文件时得到的结果:
3. TAACAAGGACCCTGTGTA
所以在这场比赛中,我们看到:
T has matched first.regex.p1
AAC has matched first.regex.p2
AAGGA has matched first.regex.p3
CC first.regex.p4
CTGTGTA has matched first.regex.p5
现在在第二个文件的第二个正则表达式中,我们看到在寻找与第二个正则表达式匹配的子字符串时,我们依赖于来自第一个文件的结果(与第一个正则表达式匹配)。特别是我们需要查看匹配的子字符串并补充匹配 first.regex.p3 和 first.regex.p4 的部分(来自 second.regex 的 rule1 和 rule2)。
complement means:
A will be substituted by T
T -> A
G -> C
C -> G
因此,如果您有 TAAA,则补码将是 ATTT。
因此,回到这个例子:
- TAACAAGGACCCTGTGTA
我们需要补充以下内容以满足第二个正则表达式的要求:
AAGGA has matched first.regex.p3
CC first.regex.p4
补语是:
TTCCT (based on rule1)
GG (based on rule2)
因此,匹配 second.regex 的子字符串示例如下:
CTAAAACACCTTTGGGTTCCTCTTAAAAAAAAAGGGGGAGAGAGAAGAAAAAAAGAGAGGG
这只是一个例子!但就我而言,我有 12000 个匹配的子字符串!我什至无法弄清楚如何解决这个问题。我曾尝试编写纯正则表达式,但我完全未能实现任何正确遵循此逻辑的东西。也许我什至不应该使用正则表达式?
是否可以完全使用正则表达式来做到这一点?还是我应该看看另一种方法?是否可以索引一个正则表达式并在第二个正则表达式引用回第一个正则表达式并强制正则表达式考虑第一个正则表达式返回的匹配子字符串?
【问题讨论】:
-
问题中有一点不清楚。假设您将在 first.regex.p3 中匹配
AAGGA,那么第二个文件中的对应匹配应该是什么:正好是 'TTCCT' 或 [CT]{2,5}?甚至 [CT]{5}? -
@MarcLambrichs 很抱歉我的文字令人费解且令人困惑。在尝试简化原始正则表达式和结果时,我也迷失在自己的文本中。回答你的问题:是的!它应该完全是
TTCCT,因为第二个文件中正则表达式的特定依赖部分的匹配长度应该与第一个文件中的匹配长度完全相同。另一个例子:如果first.regex.p4匹配第一个文件中的GGGG某个子字符串,那么第二个文件(第二个正则表达式)中对应的匹配肯定应该是CCCC。 -
这是因为它们本质上是两条 DNA 链,在某些时候它们部分地形成了一个碱基对(它们聚在一起并相互粘连)。所以第二个文件中的 TTCCT 坚持第一个文件中的 AAGGA。 michaelwosnick.com/CancerResearch/wp-content/uploads/…
标签: r regex shell perl bioinformatics