본문 바로가기
컴퓨터/자질구레 팁

정규 표현식 사용 예제들

by adnoctum 2018. 2. 26.

 

 

 

   실제로 내가 사용했었던 정규 표현식들을 정리해 둔다. vi 와 파이썬에서 주로 사용했기 때문에 이 둘을 구분하여 정리해 둔다. 기본적인 내용은 책 등의 참고 자료를 이용하고, 이 곳은 실제로 사용했던 예를 살펴 보기 위한 것이다. 될 수 있으면 자세히 설명한다. 정규 표현식은 학습 곡선이 급격한 지수 그래프를 이루곤 하는데, 초반에는 너무 복잡해 보이는 것도 어느 정도 익숙해지면 무리 없이 따라갈 수 있다. 예제를 위한 예제가 아니라 실제 사용한 것들을 살펴 보며 익숙해짐과 동시에 그 유용성을 느꼈으면 하는 바램이다. 

 

 

vi/vim 에서 의 정규 표현식


 

 

:%s/\(^.\+\tSGM\t.\+$\)/#\1/g

<tab>SGM<tab> 이 포함된 줄의 제일 처음에 # 를 입력한다. 즉, 주석 처리를 한다. 여기서 <tab>은 text file에서 탭을 의미한다. 참조, 즉, 앞에서 일치되었던 문자열을 후에 참조하기 위하여 괄호( ) 를 이용한다. 이 때, 참조를 위한 괄호라는 것을 알리기 위하여 \( 와 \) 를 이용한다. 줄의 처음(^)부터 시작해서 아무 글자나 여러 개가 오다가(.\+) 탭(\t)이 오고 내가 원하는 문자열 SGM이 나온 후 다시 탭이 나오고, 다시 아무 글자나 여러 개가 오다가(.\+) 줄의 끝($), 이런 부분을 전부 괄호로 묶어서 후참조에 이용한다. 이러한 조건에 만족된 부분은 \1 처럼 숫자로 참조할 수 있다. 지금은 괄호\( \) 를 한 개 사용했으므로 \1 로 참조하고, 두 개 이상일 경우 순서에 따라 \1, \2 처럼 참조해서 부를 수 있다. 위 조건에 만족된 부분을 #\1, 즉 제일 앞에 # 을 넣고 위 조건에 만족한 부분을 넣는다. 

 

:%s/^IPP.\+\.txt://g

IPP로 시작해서 .txt: 가 있는 부분을 삭제한다. 

 

:%s/_.\+//g

밑줄(_)부터 시작해서 그 뒷부분을 전부 지운다. 

 

:%s/\t/\r/g

tab을 줄바꿈으로 바꾼다. 

 

:%s/://g

콜론(:) 을 지운다. 

 

:%s/:.\+//g
콜론(:)부터 그 뒤를 전부 지운다. 
 
:%s/ \+/\t/g
연속된 공백을 한 개의 탭으로 바꾼다. 
 
:%s/\//\t/g
/ 라는 문자를 탭으로 바꾼다. / 는 치환식에 사용되는 특수문자이므로 \/ 으로 표현해 준다. 
 
:%s/\t.\+//g
탭과 그 뒤 문자를 모두 지운다. 
 
:%s/\..\+//g
점(.)부터 그 뒤 문자를 모두 지운다. 
 
:%s/^#\+/#/g
여러 개의 # 으로 시작하는 것을 한 개의 # 으로 바꾼다. 
 
:%s/$/\tRECEPTOR-PPI/g
가장 오른쪽에 새로운 열(컬럼)을 만들고, 그곳에 RECEPTOR-PPI 라는 문자를 쓴다. 
 
:%s/^/qdel /g
각 줄의 가장 앞에 qdel 이라는 문자를 삽입한다. 
 
:%s/^\(.\+\)$/\1\t\1/g

한 개의 컬럼으로 되어 있는 경우 그것을 동일한 두 개의 컬럼으로 만든다. 

:%s/^-\t\(.\{-\}\)\t/\1\t\1/g

     첫 번째 컬럼에 dash(-) 가 나오는 것을 두 번째 컬럼에 나오는 값으로 치환한다. 

 

 

 

 

 

python 에서의 정규 표현식


 

 

m = re.search('(GSM\d+)', id);

id로 되어 있는 변수가 GSM 문자 다음에 숫자가 오는 형식인지 확인한다. 또한 괄호(())를 이용하여 만약 조건에 맞는 형식이었을 경우 match된 부분을 후참조 해서 사용할 수 있다. 예를 들면, id가 GSM2032 였다면 m.group(1) 이 'GSM2032'가 되는 것이다. 

 

 

m = re.search('^GSE\d+', dataId);

dataId가 GSE 문자열로 시작하고 뒤에 숫자로 되어 있는지 확인한다. 

 

 

m = re.search('GSE(.*?).group.config', file_name);

file_name 변수가 GSE2032.group.config 처럼 GSE로 시작한 후 뒤에 아무 문자열이나 온 뒤 .group.config로 되어 있는지 확인한다. 그 후, GSE 다음과  .group.config 사이의 문자열을 후참조 해서 사용하고자 ( ) 를 사용했다. 이 때, GSE 다음에 오는 글자가 숫자일 필요는 없다. 또한, .*? 를 하여 최소만족을 이용하고 있다. 

 

 

m = re.search('\t(ftp://ftp.ebi.ac.uk/.*?\.zip)\t', line);

line의 변수에 <tab> 그 후 ftp://ftp.ebi.ac.uk/ 가 나오고 그 후 아무 문자열이나 나온 후 .zip <tab>  으로 되어 있는 부분이 있는지 확인한다. 이 때, 만약 이 조건을 만족시키는 부분 중  ftp 주소 부분을 후참조하기 위해 괄호를 사용했다. 

 

 

m = re.search('^adnoctum.+normalize_GPL570_by_MAS5\.R', p);

p 변수가 adnoctum 으로 시작하고 아무 글자나 오다가 normalize_GPL570_by_MAS5.R로 되어 있는 부분이 있는지 확인한다. 이 때, 아무 글자 한 글자에 match되는 점(dot, .)이 아니라 정확히 점(dot, .) 그 문자를 지칭하기 위해 \. ( \ 다음에 점(dot, .) )  을 이용했다. 이것은 ps -Af 의 명령어의 결과물을 받아서 내가 실행시킨 명령어 중 저 명령어가 있는지 확인하기 위한 것. 

 

 

m = re.search('^DISEASE:(.*?)$', line);

line으로 된 변수가 DISEASE:로 시작하는 것인지를 확인한다. 만약 그렇다면 DISEASE: 뒤에 나온 문자열 전부를 후참조하여 사용하기 위해 괄호를 사용했다. 

 

 

m = re.search('(GSE[\d_]+)', file_name);

file_name 변수에 GSE로 시작하고 뒤에 숫자나 밑줄로 된 형식이 있는지 확인한다. 즉, 이 경우 file_name 변수가 GSE2032, GSE2032_3, GSE9999_2_3 처럼 GSE 뒤에는 '숫자 혹은 밑줄'이 여러 개가 오는 것은 모두 만족이 된다. 대괄호( [  ] )는 문자의 집합을 의미하는데 예를 들면 \d는 숫자이므로 [0123456789] 와 동일한 것이다. 현재의 경우 숫자와 밑줄을 모두 사용하기 위해 이 둘을 대괄호로 묶었다. 

 

 

m = re.search('^(.*?\.txt):SAMPLE', v[0]);

아무 글자로나 시작하고 .txt:SAMPLE 로 끝나는 부분까지를 일치시킨다. 이 때, 괄호를 이용하여 후참조 할 부분을 지정하고 있다. 예를 들면, 

normal.file.txt:SAMPLE    1    2    3

case_normal_vs_cancer.txt:SAMPLE    a    b    c    d    e

처럼 붉은색으로 된 부분을 후참조 하기 위한 부분이다. 여기서도 역시 최소일치가 사용되고 있다. 

 

 

m = re.search('MUTATION:.*?:EXACT', attr);

MUTATION: 다음에 아무 글자나 오고 :EXACT 로 된 글자가 나오는 부분이 있는지 확인한다. 이 때는 후참조를 할 필요가 없기 때문에 괄호를 사용하지 않았다.