Python cs50 PSET6/DNA正则表达式
我试图通过在序列文件中查找连续STR(一个子字符串模式,即“AGAT”)的数量来工作 字符串模式:AGATC、TTTTCT、AATG、TCTAG、GATA、TATC、GAAA、TCTG 序列文件(许多其他序列文件中的一个):aaggtaagtttagaatataaggtgtagtaaatagaaaggttaaaattaaggagatcagatcagatcagatcagatctatctatctatctatctatcatcagagagagagataatagtagagagagataatagtagagatagatgagataatgatggaatattgttggaaagaggatagagagagagagg 在上述顺序中,TATC是连续运行5对TATC的最大值。对于我的正则表达式,它将返回匹配项,无论它们是否连续 我相信使用正则表达式是我最好的选择。这是我第一次使用Python,所以不要期望太多。我在regex101.com上使用了regex工具,它让我对regex公式有了一些很好的了解。我将一个变量传递到带有{head}的正则表达式中,这是字符串模式,但我希望找到匹配的字符串Python cs50 PSET6/DNA正则表达式,python,regex,cs50,Python,Regex,Cs50,我试图通过在序列文件中查找连续STR(一个子字符串模式,即“AGAT”)的数量来工作 字符串模式:AGATC、TTTTCT、AATG、TCTAG、GATA、TATC、GAAA、TCTG 序列文件(许多其他序列文件中的一个):aaggtaagtttagaatataaggtgtagtaaatagaaaggttaaaattaaggagatcagatcagatcagatcagatctatctatctatctatctatcatcagagagagagataatagtagagagagataatagtagaga
{head}
2次或更多次。我的bellow regex至少会返回1次或更多次与head
匹配的结果,因此我知道为什么会这样返回
groups = re.findall(rf'?:{head})+, text)
如果我在regex101.com中使用r“(AGAT){2,}”
,这就是我期望的工作方式。它查找匹配的字符串2次或多次。如果我将它作为groups=re.findall(rf'(?:{head}){2,})
传递到代码中,它不会返回任何内容
我的代码如下:
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 []
因此,我想我是在问,如何使用regex查找字符串(作为变量传递)2次或更多次?您可以在正则表达式中使用pattern((您的模式)\2*)
查找最大的连续模式(对于patternTATC
):
印刷品:
Most repeated pattern: TATC, number of repetitions 5
这个答案来自Reddit的cs50子Reddit上的一个用户yeahIProgram
"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的支持。我尝试了
groups=re.findall(rf'(?:{head})\2*”
我发现自己有很多错误。我可以将字符串模式放在一个数组中,但我们面临的挑战是将这些模式作为CSV文件的头,我们需要将其取出。这就是为什么我需要将其保留为变量。我尝试了两种建议groups=re.findall(rf'(?:{head})\1*,text)
和groups=re.findall(rf'(?:{head})\2*,text)
都返回了错误。如下:回溯(最近一次调用):STRs=re.compile(rf'(?:{head})\2*)文件“/usr/local/lib/python3.7/sre_parse.py”,第399行,在_escape-raise-source.error中(“无效的组引用%d”%group,len(escape)-1)re.error:无效的组引用2位于位置9不幸的是,我仍在抛出错误。回溯(最后一次调用):文件“dna.py”,第31行,在groups=re.findall(rf'((?{head})\2*),text)re.error:未知扩展名?n位于位置2
@Rsp8请不要使用?
:groups=re.findall(rf'({head})\2*),text)
->正如我在回答中所说的那样。@Anrej Kesley,这似乎是可行的,但它不是只返回一个字符串,而是返回多个。AGATC[('agatcagatcagatc','AGATC')]tttttttttt-ct[]AATG[('AATG','AATG')]TCTAG[[GATA[('GATA','GATA','GATA'),('GATA','GATA')]TATC[('TATCTATCTATCTATC','TATC')]GAAA[('GAAA','GAAA','GAAA'),('GAAA','GAAA'),('GAAA','GAAA')]TCTG[]
我只需要最长的连续时间。我会继续玩它。
AGATC [('AGATCAGATCAGATCAGATC', 'AGATC')]
TTTTTTCT []
AATG []
TCTAG []
GATA []
TATC [('TATCTATCTATCTATCTATC', 'TATC')]
GAAA []
TCTG []