실제로 내가 사용했었던 정규 표현식들을 정리해 둔다. 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/^-\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 로 된 글자가 나오는 부분이 있는지 확인한다. 이 때는 후참조를 할 필요가 없기 때문에 괄호를 사용하지 않았다.
'컴퓨터 > 자질구레 팁' 카테고리의 다른 글
공유기를 통해 특정 컴퓨터로 접속하기 (port forwarding) (2) | 2018.03.05 |
---|---|
맥북에서 대/소문자 한/영 전환 (0) | 2018.02.27 |
윈도우즈의 vim 에서 텍스트 파일의 주석(#)이 작동하지 않을 때 (0) | 2017.10.06 |
vi 에서 tab 이 계속 space 로 바뀔 때 (0) | 2016.12.14 |
윈도우즈에서 만들 수 없는 파일 이름 (0) | 2014.02.03 |