cs50 PSET6/DNA 正则表达式
cs50 PSET6/DNA Regular Expressions
我正在尝试查找序列文件中连续 STR(子字符串模式,即“AGAT”)的数量。
字符串模式:AGATC、TTTTTTCT、AATG、TCTAG、GATA、TATC、GAAA、TCTG
序列文件(许多其他序列文件之一):AAGGTAAGTTTAGAATATAAAAGGTGAGTTAAATAGAATAGGTTAAAAATTAAAGGAGATCAGATCAGATCAGATCTATCTATCTATCTATCTATCAGAAAAGAGTAAATAGTTAAAGAGTAATATATTGAATTAATGGAAAATATTGTTGGGGAAAGGAGGGATAGAAGG
在上述序列中,TATC 是最大值,有 5 个连续的 TATC 对 运行。使用我的正则表达式,无论它们是否连续,它都是 returning 匹配。
我相信使用正则表达式是我最好的选择。这是我第一次在 Python 工作,所以不要期望太多。我在 regex101.com 使用了 regex 工具,它让我对 regex 公式有了一些很好的了解。我正在使用 {head} 将变量传递到正则表达式,这是字符串模式,但我想找到匹配的字符串 {head}
2 次或更多次。我下面的正则表达式 return 与 head
匹配至少 1 次或更多次,所以我知道为什么会这样 return。
groups = re.findall(rf'?:{head})+, text)
如果我在 regex101.com 中使用 r"(AGAT){2,}"
,这将按我预期的方式工作。它找到匹配的字符串 2 次或更多次。如果我将它作为 groups = re.findall(rf'(?:{head}){2,})
传递到我的代码中,它不会 return 任何东西。
我的代码如下:
import csv
import re
import string
if len(sys.argv) != 3:
print("missing command-line argument")
exit(1)
if re.search(r"(.csv)", sys.argv[1]) == None:
print("CSV file not found!")
print("Usage: 'python.py *.csv *.txt'")
exit(1)
if re.search(r"(.txt)", sys.argv[2]) == None:
print("TXT file not found!")
print("Usage: 'python.py *.csv *.txt'")
exit(1)
# use reader or DictReader from the CSV module
# use sys.argv for command-line arguments
# use open(filename) and f.read() to read its contents.
# open CSV and DNA sequence and read into memory
with open(sys.argv[1], newline='') as database, open(sys.argv[2], newline='') as sequence:
reader = csv.DictReader(database)
headers = reader.fieldnames
text = sequence.read()
for head in headers:
groups = re.findall(rf'(?:{head})+', text)
print(head, groups)
如果我使用上面的 groups = re.findall(rf'(?:{head})+', text)
变量,我会得到下面的输出
AGATC ['AGATCAGATCAGATCAGATC']
TTTTTTCT []
AATG ['AATG']
TCTAG []
GATA ['GATA', 'GATA']
TATC ['TATCTATCTATCTATCTATC']
GAAA ['GAAA', 'GAAA', 'GAAA']
TCTG []
如果我使用 groups = re.findall(rf'(?:{head}){2,}', text)
,我什么也得不到。
AGATC []
TTTTTTCT []
AATG []
TCTAG []
GATA []
TATC []
GAAA []
TCTG []
所以,我想我是在问,如何使用正则表达式查找字符串(作为变量传递)2 次或更多次?
您可以在正则表达式中使用模式 ((your pattern)*)
来查找最大的连续模式(regex101 用于模式 TATC
):
import re
seq = 'AAGGTAAGTTTAGAATATAAAAGGTGAGTTAAATAGAATAGGTTAAAATTAAAGGAGATCAGATCAGATCAGATCTATCTATCTATCTATCTATCAGAAAAGAGTAAATAGTTAAAGAGTAAGATATTGAATTAATGGAAAATATTGTTGGGGAAAGGAGGGATAGAAGG'
patterns = ['AGATC','TTTTTTCT','AATG','TCTAG','GATA','TATC','GAAA','TCTG']
m = max([x for p in patterns for x in re.findall(r'(({})*)'.format(p), seq)], key=lambda k: len(k[0]) // len(k[1]))
print('Most repeated pattern: {}, number of repetitions {}'.format(m[1], len(m[0]) // len(m[1])))
打印:
Most repeated pattern: TATC, number of repetitions 5
这个答案是用户 yeahIProgram 在 Reddit 的 cs50 subreddit 上给出的。
"That's what I was referring to, but I had to look it up and you escape the braces inside the formatted string by doubling them."
所以,我正在寻找的正则表达式是 groups = re.findall(rf'(({head}){{2,}})', text)
。其中返回了我期望的以下输出。
AGATC [('AGATCAGATCAGATCAGATC', 'AGATC')]
TTTTTTCT []
AATG []
TCTAG []
GATA []
TATC [('TATCTATCTATCTATCTATC', 'TATC')]
GAAA []
TCTG []
现在,我只需要获取字符串出现的总次数,我应该就可以了。
感谢@Andrej Kesely 的意见。
我正在尝试查找序列文件中连续 STR(子字符串模式,即“AGAT”)的数量。
字符串模式:AGATC、TTTTTTCT、AATG、TCTAG、GATA、TATC、GAAA、TCTG
序列文件(许多其他序列文件之一):AAGGTAAGTTTAGAATATAAAAGGTGAGTTAAATAGAATAGGTTAAAAATTAAAGGAGATCAGATCAGATCAGATCTATCTATCTATCTATCTATCAGAAAAGAGTAAATAGTTAAAGAGTAATATATTGAATTAATGGAAAATATTGTTGGGGAAAGGAGGGATAGAAGG
在上述序列中,TATC 是最大值,有 5 个连续的 TATC 对 运行。使用我的正则表达式,无论它们是否连续,它都是 returning 匹配。
我相信使用正则表达式是我最好的选择。这是我第一次在 Python 工作,所以不要期望太多。我在 regex101.com 使用了 regex 工具,它让我对 regex 公式有了一些很好的了解。我正在使用 {head} 将变量传递到正则表达式,这是字符串模式,但我想找到匹配的字符串 {head}
2 次或更多次。我下面的正则表达式 return 与 head
匹配至少 1 次或更多次,所以我知道为什么会这样 return。
groups = re.findall(rf'?:{head})+, text)
如果我在 regex101.com 中使用 r"(AGAT){2,}"
,这将按我预期的方式工作。它找到匹配的字符串 2 次或更多次。如果我将它作为 groups = re.findall(rf'(?:{head}){2,})
传递到我的代码中,它不会 return 任何东西。
我的代码如下:
import csv
import re
import string
if len(sys.argv) != 3:
print("missing command-line argument")
exit(1)
if re.search(r"(.csv)", sys.argv[1]) == None:
print("CSV file not found!")
print("Usage: 'python.py *.csv *.txt'")
exit(1)
if re.search(r"(.txt)", sys.argv[2]) == None:
print("TXT file not found!")
print("Usage: 'python.py *.csv *.txt'")
exit(1)
# use reader or DictReader from the CSV module
# use sys.argv for command-line arguments
# use open(filename) and f.read() to read its contents.
# open CSV and DNA sequence and read into memory
with open(sys.argv[1], newline='') as database, open(sys.argv[2], newline='') as sequence:
reader = csv.DictReader(database)
headers = reader.fieldnames
text = sequence.read()
for head in headers:
groups = re.findall(rf'(?:{head})+', text)
print(head, groups)
如果我使用上面的 groups = re.findall(rf'(?:{head})+', text)
变量,我会得到下面的输出
AGATC ['AGATCAGATCAGATCAGATC']
TTTTTTCT []
AATG ['AATG']
TCTAG []
GATA ['GATA', 'GATA']
TATC ['TATCTATCTATCTATCTATC']
GAAA ['GAAA', 'GAAA', 'GAAA']
TCTG []
如果我使用 groups = re.findall(rf'(?:{head}){2,}', text)
,我什么也得不到。
AGATC []
TTTTTTCT []
AATG []
TCTAG []
GATA []
TATC []
GAAA []
TCTG []
所以,我想我是在问,如何使用正则表达式查找字符串(作为变量传递)2 次或更多次?
您可以在正则表达式中使用模式 ((your pattern)*)
来查找最大的连续模式(regex101 用于模式 TATC
):
import re
seq = 'AAGGTAAGTTTAGAATATAAAAGGTGAGTTAAATAGAATAGGTTAAAATTAAAGGAGATCAGATCAGATCAGATCTATCTATCTATCTATCTATCAGAAAAGAGTAAATAGTTAAAGAGTAAGATATTGAATTAATGGAAAATATTGTTGGGGAAAGGAGGGATAGAAGG'
patterns = ['AGATC','TTTTTTCT','AATG','TCTAG','GATA','TATC','GAAA','TCTG']
m = max([x for p in patterns for x in re.findall(r'(({})*)'.format(p), seq)], key=lambda k: len(k[0]) // len(k[1]))
print('Most repeated pattern: {}, number of repetitions {}'.format(m[1], len(m[0]) // len(m[1])))
打印:
Most repeated pattern: TATC, number of repetitions 5
这个答案是用户 yeahIProgram 在 Reddit 的 cs50 subreddit 上给出的。
"That's what I was referring to, but I had to look it up and you escape the braces inside the formatted string by doubling them."
所以,我正在寻找的正则表达式是 groups = re.findall(rf'(({head}){{2,}})', text)
。其中返回了我期望的以下输出。
AGATC [('AGATCAGATCAGATCAGATC', 'AGATC')]
TTTTTTCT []
AATG []
TCTAG []
GATA []
TATC [('TATCTATCTATCTATCTATC', 'TATC')]
GAAA []
TCTG []
现在,我只需要获取字符串出现的总次数,我应该就可以了。
感谢@Andrej Kesely 的意见。