정규식(Regular Expression)-기호와 메타문자

문자 찾는 것 자체는 find()도 해주는데, 얘는 딱 정확하게 일치하는 문자열만 찾아준다. 그럼 정규식은? 그건 대충 와일드카드같은 거다. 그러니까 find()는 소라빵 찐빵 팥빵 붕어빵 이런 식으로 딱딱 키워드를 찾는거고 정규식은 *빵으로 소라빵 찐빵 붕어빵 팥빵 다 찾는 거지.

일단 정규식을 쓰려면 re를 불러야 하니…

import re

콜 ㅇㅇ


정규식 문자

정규식에서 쓰는 문자들의 종류와 쓰는 방법에 대해 알아보자.

.

for i in range(len(pokemon)):
    if re.search('김.',pokemon[i]):
        print(pokemon[i])
김부추
김후추
김양상추
박알타리김치
고등어김치찜
김배추

참고로 전부 본인 포켓몬 이름이다 왜 고등어김치찜이 이름인데요 그거 지을때 엄마가 고등어김치찜 했음

.는 와일드카드로, 구글 검색의 *와 같은 역할을 한다.

^

for i in range(len(pokemon)):
    if re.search('^김',pokemon[i]):
        print(pokemon[i])
김부추
김후추
김양상추
김배추

꺾쇠가 들어가면 ~로 시작하는 단어를 찾아준다. 위 정규식은 김으로 시작하는 단어를 찾아달라는 얘기. searcher에 들어간 그 왜 뭐더라 D로 시작하는 효소!!! 도 저 기능을 이용한 것이다. 

#

for i in range(len(pokemon)):
    if re.search('!$',pokemon[i]):
        print(pokemon[i])
앗!잘못던짐!
고객님!

어떤 단어로 끝나는 걸 찾아준다. 꺾쇠와 달리 얘는 뒤에 쓴다. 그러니까 ^엄마는 엄마로 시작하는 단어를, 엄마$는 엄마로 끝나는 단어를 찾아달라는 얘기. (이거 R에서도 나온다)

|

for i in range(len(df)):
    enzyme = df['Enzyme'][i]
    sequence = df['sequence'][i]
    if re.search('W|S',sequence):
        print(enzyme,sequence)

OR, 햄버거|피자는 햄버거 혹은 피자라는 얘기다. 

[]

for i in range(len(df)):
    enzyme = df['Enzyme'][i]
    sequence = df['sequence'][i]
    if re.search('[NSW]',sequence):
        print(enzyme,sequence)

일단 하는 역할 자체는 OR이랑 비슷하다. 대괄호 안에 있는것들 중 하나를 포함하고 있는 것. Cutter에 있는 제한효소 인식 시퀀스도 전부 대괄호로 치환한 것.

[^]

for i in range(len(df)):
    enzyme = df['Enzyme'][i]
    sequence = df['sequence'][i]
    if re.search('^Ba[^c]',enzyme):
        print(enzyme,sequence)
BaeI ACNNNNGTAYC
Bal228I GGNCC
BamNII GGWCC
BanI GGYRCC
BanII GRGCYC
BasI CCANNNNNTGG
BavAII GGNCC
BavBII GGNCC

쓰는 법은 일반적인 ^ 쓰는것처럼 앞에 붙이면 된다. 단, 대괄호 안에 있는 꺾쇠는 [] 안에 있는것들 중 쟤는 빼라는 얘기.

[-]

어디부터 어디까지라고 지정하는 것.

[a-z] : 영어 문자의 모든 범위를 지정한다.

[가-힣] : 한글 문자의 모든 범위를 지정한다.

[0-9] : 숫자의 모든 범위를 지정한다.

()

for i in range(len(df)):
    enzyme = df['Enzyme'][i]
    sequence = df['sequence'][i]
    if re.search('(Eco)',enzyme):
        print(enzyme,sequence)
Eco24I GRGCYC
Eco31I GGTCTC
Eco47I GGWCC
Eco57I CTGAAG
Eco64I GGYRCC
Eco81I CCTNAGG
Eco88I CYCGRG
Eco91I GGTNACC
Eco130I CCWWGG
Eco1831I CCSGG
EcoA4I GGTCTC
EcoHI CCSGG
EcoHK31I YGGCCR
Eco75KI GRGCYC
Eco57MI CTCRAG
EcoNI CCTNNNNNAGG
EcoO44I GGTCTC
EcoO65I GGTNACC
EcoO109I RGGNCCY
EcoO128I GGTNACC
EcoP15I CACGAG
EcoR124II GAANNNNNNNRTCG
EcoRII CCWGG
EcoT14I CCWWGG
EcoT38I GRGCYC
Eco13kI CCNGG
Eco21kI CCNGG
Eco27kI CYCGRG
Eco137kI CCNGG

괄호 안에 있는 걸 그룹으로 묶어서 찾는다. [붕어빵]은 붕 아님 어 아님 빵 들어간건 다 찾아주는데 (붕어빵)은 붕어빵만 찾는다.

메타 문자

백슬래시 뒤에 뭐가 오는 것.

\d, \D

각각 숫자 포함, 숫자 제외.

for i in range(len(pokemon)):
    if re.search('\d',pokemon[i]):
        print(pokemon[i])
대포동1호
김2번척추씨

잠깐만 대포동1호 뭐예요 파이어로요

for i in range(len(df)):
    enzyme = df['Enzyme'][i]
    sequence = df['sequence'][i]
    if re.search('^A..\D',enzyme):
        print(enzyme,sequence)
AarI CACCTGC
AccI GTMKAC
AccB1I GGYRCC
AccB2I RGCGCY
AccB7I CCANNNNNTGG
AceI GCWGC
AceIII CAGCTC
AclWI GGATC
AcoI YGGCCR
AcpII CCANNNNNTGG
AcrII GGTNACC
AcsI RAATTY
AcuI CTGAAG
AcyI GRCGYC
AdeI CACNNNGTG
AeuI CCWGG
AfiI CCNNNNNNNGG
AflI GGWCC
AflIII ACRYGT
AglI CCWGG
AgsI TTSAA
AhaI CCSGG
AhaII GRCGYC
AhdI GACNNNNNGTC
AjnI CCWGG
AjuI GAANNNNNNNTTGG
AlfI GCANNNNNNTGC
AloI GAACNNNNNNTCC
AlwI GGATC
AlwNI CAGNNNCTG
AlwXI GCAGC
AmaCSI GCTCCA
AocI CCTNAGG
AocII GDGCHC
AorI CCWGG
AosII GRCGYC
ApaBI GCANNNNNTGC
ApaORI CCWGG
ApeKI GCWGC
ApoI RAATTY
ApyI CCWGG
ApyPI ATCGAC
AquI CTCGRG
AquII GCCGNAC
AquIII GAGGAG
AquIV GRGGAAG
ArsI GACNNNNNNTTYG
AseII CCSGG
AspI GACNNNGTC
AspAI GGTNACC
AspEI GACNNNNNGTC
AspHI GWGCWC
AspNI GGNNCC
AstWI GRCGYC
AsuI GGNCC
AsuIII GRCGYC
AsuC2I CCSGG
AsuHPI GGTGA
AtsI GACNNNGTC
AvaI CYCGRG
AvaII GGWCC
AvcI GGNCC

소문자 d는 숫자 포함이고 대문자 D는 숫자 제외다.

\s, \S

for i in range(len(list_n)):
    if re.search('a\s',list_n[i]):
        print(list_n[i])
a bc
a b c

\s(공백 포함)

for i in range(len(list_n)):
    if re.search('a\S',list_n[i]):
        print(list_n[i])
abc
ab c
abab

\S(공백 제외)

\b, \B

text='he said checkmate for my class mate, before she move her knight.'

이 구문이 있을 때

p = re.compile(r'\bmate')
p.search(text)

이걸 치면 class mate의 mate가 나온다.

p = re.compile(r'\Bmate')
p.search(text)

이건 체크메이트의 메이트. 즉 \b, \B는 단어와 단어 사이의 공백 유무에 따라 다르다.

\w, \W

각각 숫자와 알파벳, 숫자와 알파벳 제외.

for i in range(len(df)):
    enzyme = df['Enzyme'][i]
    sequence = df['sequence'][i]
    if re.search('^X..\w',enzyme):
        print(enzyme,sequence)
XagI CCTNNNNNAGG
XapI RAATTY
XceI RCATGY
XcmI CCANNNNNNNNNTGG
XhoII RGATCY
XmiI GTMKAC
XmnI GAANNNNTTC

\w로 X로 시작하는 제한효소를 검색한 결과

for i in range(len(df)):
    enzyme = df['Enzyme'][i]
    sequence = df['sequence'][i]
    if re.search('^X..\W',enzyme):
        print(enzyme,sequence)

제한효소의 이름은 전부 숫자 or 알파벳이므로 이 옵션을 주면 검색결과가 안 나와야 정상이다.

\A, \Z

문자열의 시작과 끝으로, 각각 ^와 $에 대응된다. 단, Multiline을 주더라도 얘는 문자열의 시작과 끝을 출력한다.

*, *?

반복을 나타내는 문자. 0회 이상 반복이면 다 찾는다.

for i in range(len(pokemon)):
    if re.search('김*추',pokemon[i]):
        print(pokemon[i])
김부추
김후추
김양상추
김배추
김2번척추씨

김과 추 사이에 뭔가 있으면 다 소환된다.

+, +?

얘는 *과 달리 한 번 이상 반복이면 찾는다.

for i in range(len(df)):
    enzyme = df['Enzyme'][i]
    sequence = df['sequence'][i]
    if re.search('^Ca+',enzyme):
        print(enzyme,sequence)
Cac8I GCNNGC
CaiI CAGNNNCTG
CauI GGWCC
CauII CCSGG

위 코드는 C로 시작하면서 a가 한 번 이상 들어가는 제한효소만 나온다. 

?

for i in range(len(df)):
    enzyme = df['Enzyme'][i]
    sequence = df['sequence'][i]
    if re.search('^Ca?',enzyme):
        print(enzyme,sequence)
Cac8I GCNNGC
CaiI CAGNNNCTG
CauI GGWCC
CauII CCSGG
CbrI CCWGG
CcuI GGNCC
CelII GCTNAGC
CfrI YGGCCR
Cfr10I RCCGGY
Cfr13I GGNCC
CfrBI CCWWGG
CjeI CCANNNNNNGT
CjePI CCANNNNNNNTC
CpoI CGGWCCG
CspI CGGWCCG
CspCI CAANNNNNGTGG
Csp68KI GGWCC
CstMI AAGGAG
CthII CCWGG
CviBI GANTC
CviJI RGCY
CviTI RGCY
CvnI CCTNAGG

0회 or 1회 이상 반복. …이럴거면 그냥 C로 시작하는 거 뽑고 말지…

{}

반복 횟수를 지정할 수 있다.

for i in range(len(pokemon)):
    if re.search('김.{1}추',pokemon[i]):
        print(pokemon[i])

아무거나 1회 반복

for i in range(len(pokemon)):
    if re.search('김.{1,3}추',pokemon[i]):
        print(pokemon[i])

아무거나 1~3회 반복

for i in range(len(df)):
    enzyme = df['Enzyme'][i]
    sequence = df['sequence'][i]
    if re.search('[GATC]{3}N{3}[GATC]',sequence):
        print(enzyme,sequence)
AdeI CACNNNGTG
AlwNI CAGNNNCTG
AspI GACNNNGTC
AtsI GACNNNGTC
BstZ316I CACNNNGTG
CaiI CAGNNNCTG
DraIII CACNNNGTG
PflFI GACNNNGTC
PsyI GACNNNGTC
TelI GACNNNGTC
Tth111I GACNNNGTC

GATC 중 아무거나 3개 반복되고 N이 3개 온 다음 GATC가 오는 패턴