Finder는 도입하려면 좀 걸립니다... 얘는 아예 정규식+찾아바꾸기가 필요한거라......
정규식 도입
import pandas as pd import re from datetime import datetime enzyme_table = pd.read_csv('/home/koreanraichu/restriction.csv') enzyme_table2 = pd.read_csv('/home/koreanraichu/restriction_RE.csv') # 정규식 도입을 위해... 어쩔 수 없이 합쳤음... enzyme_table = pd.concat([enzyme_table,enzyme_table2]) enzyme_table = enzyme_table.sort_values('Enzyme') enzyme_table.reset_index(inplace=True) # 합쳤다... print(enzyme_table)
뭐가 좀 많은데, RE 들어가는 csv파일이 정규식 처리가 필요한 효소들. 인식 시퀀스에 N, S, B같은 게 있는 효소들이다. 정규식 없이 find를 쓰면 못 찾기때문에 뺐다.
class RE_treatment: def RE_wildcard(self,before_seq): self.before_seq = before_seq before_seq = before_seq.replace("N",".") return before_seq # Wildcard: 시퀀스 데이터에 N이 있을 경우 Wildcard로 바꾼다. def RE_or(self,before_seq): self.before_seq = before_seq if "B" in before_seq: before_seq = before_seq.replace("B","[CGT]") elif "D" in before_seq: before_seq = before_seq.replace("D","[AGT]") elif "H" in before_seq: before_seq = before_seq.replace("H","[ACT]") elif "K" in before_seq: before_seq = before_seq.replace("K","[GT]") elif "M" in before_seq: before_seq = before_seq.replace("M","[AC]") elif "R" in before_seq: before_seq = before_seq.replace("R","[AG]") elif "S" in before_seq: before_seq = before_seq.replace("S","[CG]") elif "V" in before_seq: before_seq = before_seq.replace("V","[ACG]") elif "W" in before_seq: before_seq = before_seq.replace("W","[AT]") elif "Y" in before_seq: before_seq = before_seq.replace("Y","[CT]") return before_seq # Or: 시퀀스 데이터에 N 말고 ATGC 말고 다른 알파벳이 있을 경우, 해당하는 정규식 문법으로 바꾼다.
클래스. 대충 쿠키틀 해당 클래스는 N, D, B와 같은 알파벳들을 정규식 처리 하는 코드를 담고 있다.
def convert (a): RE = RE_treatment() while True: if "N" in res_find: res_find_after = RE.RE_wildcard(res_find) elif "B" in res_find or "D" in res_find or "H" in res_find or "K" in res_find or "M" in res_find or "R" in res_find or "S" in res_find or "V" in res_find or "W" in res_find or "Y" in res_find: res_find_after = RE.RE_or(res_find) else: break return res_find_after
무식하게 조건문 때려박은 if문... 저 While True가 없으면 GCDGHC처럼 알파벳이 여러글자일 때에 대한 처리가 안된다. (N은 아예 일괄적으로 wildcard화 함)
if "N" in res_find or "B" in res_find or "D" in res_find or "H" in res_find or "K" in res_find or "M" in res_find or "R" in res_find or "S" in res_find: res_find_after = str(convert(res_find)) else: res_find_after = res_find # 정규식 처리(문자가 두 개 이상일때에 대한 처리가 필요함) Findall = re.findall(res_find_after,sequence) if Findall: count += 1 site_count = len(Findall) if site_count == 1: once_cut_list.append(enzyme) elif site_count == 2: two_cut_list.append(enzyme) else: multi_cut_list.append(enzyme) res_loc_list = ', '.join(res_loc_list) f.write("{0}: {1} {2},{3} times cut. Where(bp): {4} \n".format(enzyme,res_find,feature,site_count,res_loc_list))
(그래서 대충 문제의 코드)
어디 자르는지 세 주는 기능
얘는 쉽다.
def cut_func (a,b): global res_loc_list locs = re.finditer(a,b) for i in locs: loc = i.start() res_loc_list.append(str(loc)) return res_loc_list # 여기가 위치 관련 함수입니다.
finditer()로 다 찾은 다음, 해당 레코드에서 start(시작 지점)을 리스트화하면 된다.

결과
이제 Finder에 도입한 다음 FASTA까지 하면 어지간한건 다 된다.
'Coding > Python' 카테고리의 다른 글
정규식(Regular Expression)-re모듈 사용법 (0) | 2022.08.22 |
---|---|
정규식(Regular Expression)-기호와 메타문자 (0) | 2022.08.22 |
Searcher 기능 추가: 그 뭐더라 그 D로 시작하는 그거 (0) | 2022.08.21 |
cutter, finder, searcher에 앞으로 추가할 기능 (0) | 2022.08.21 |
For vs While (0) | 2022.08.21 |