簡體   English   中英

cs50 PSET6/DNA 正則表達式

[英]cs50 PSET6/DNA Regular Expressions

我試圖通過在序列文件中查找連續 STR(子字符串模式,即“AGAT”)的數量來工作。

字符串模式:AGATC、TTTTTTCT、AATG、TCTAG、GATA、TATC、GAAA、TCTG

序列文件(許多其他序列文件之一): AAGGTAAGTTTAGAATATAAAAGGTGAGTTAAATAGAATAGGTTAAAATTAAAGGAGATCAGATCAGATCAGATCTATCTATCTATCTATCTATCAGAAAAGAGTAAATAGTTAAAGAGTAAGATATTGAATTAATGGAAAATATTGTTGGGGAAAGGAGGGATAGAAGG

在上述序列中,TATC 是運行 5 個連續 TATC 對時的最大值。 使用我的正則表達式,無論它們是否連續,它都會返回匹配項。

我相信使用正則表達式是我最好的選擇。 這是我第一次使用 Python,所以不要期望太多。 我在 regex101.com 上使用了 regex 工具,它讓我對 regex 公式有了一些很好的了解。 我將一個變量傳遞給帶有 {head} 的正則表達式,這是字符串模式,但我想找到匹配的字符串{head} 2 次或更多次。 我下面的正則表達式返回一個匹配head至少 1 次或多次,所以我知道為什么它會以這種方式返回。

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 []

所以,我想我在問,如何使用正則表達式查找字符串(作為變量傳遞)2 次或更多次?

您可以在正則表達式中使用 pattern ((your pattern)\\2*)來查找最大的連續模式( 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'(({})\2*)'.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

這個答案來自 Reddit 的 cs50 subreddit 上的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 的意見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM