정규표현식 - 1시간짜리 작업을 1분에 끝내기

Tip&Tech 2016.01.21 16:31

정규표현식을 아시나요?

구글에서 검색해 보세요. 그럼 아주 많은 자료가 나옵니다.

개발자들에게는 아주 익숙한 단어인데 전자책을 편집하는 분들은 화성어 같을거예요.


개발자나 쓰는걸 왜?


정규표현식은 이런거예요.


\d

[A-Za-z]

(.*)


점점 더 뭔소리인지 모르겠지요?

이런게 전자책 편집하고 무슨 상관이 있나 싶어 창을 닫는다면 1시간짜리 편집 시간을 1분으로 줄일 수 있는 엄청난 기회를 버리는겁니다 ^^


Sigil은 검색 기능, 다시 말해 찾기와 찾아바꾸기에서 정규표현식을 지원합니다.

긴 설명 대신 간단한 예를 먼저 보여드릴게요.


조선 세종(朝鮮 世宗, 1397년 5월 7일[1] (음력 4월 10일) ~ 1450년 3월 30일 (음력 2월 17일), 재위 1418년 ~ 1450년)은 조선의 제4대 왕이다. 성(姓)은 이(李), 휘(諱)는 도(裪), 본관(本貫)은 전주(全州), 자(字)는 원정(元正), 아명은 막동(莫同)이다. 세종은 묘호(廟號)이며, 시호(諡號)는 영문예무인성명효대왕(英文睿武仁聖明孝大王)이고, 명에서 받은 시호는 장헌(莊憲)이다. 존시를 합치면 세종장헌영문예무인성명효대왕이 된다. 태종(太宗)과 원경왕후(元敬王后)의 셋째 아들이며, 비는 청천부원군(靑川府院君) 심온(沈溫)의 딸 소헌왕후 심씨(昭憲王后 沈氏)이다.


위 문장에서 한글 옆에 붙은 한자만 스타일을 바꿔야 할 때 지금까지 어떤 방법을 쓰셨나요?


1. 하나씩 찾아서 스타일을 적용했다면 300페이지짜리 책 한권을 전부 바꾸는데 얼마나 걸릴까요?

2. 조금 센스가 있는 분들은 괄호를 찾아바꾸기로 변경했을거예요. 그럼 이런 편집은 어떻게 바꾸세요?

조선 세종(朝鮮 世宗, 1397년 5월 7일[1] (음력 4월 10일) ~ 1450년 3월 30일 (음력 2월 17일), 재위 1418년 ~ 1450년)은 조선의 제4대 왕이다. 성姓은 이李, 휘諱는 도裪, 본관本貫은 전주全州, 자字는 원정元正, 아명은 막동莫同이다.


위 문장의 한자만 본문 글자와 구분하기 쉽게 파란색으로 바꾼다면? 괄호도 없으니 하나씩 찾아 수정을 해줬을거예요.

그러다보면 시간도 오래 걸리고 놓치는 한자도 생깁니다.


이럴 때 정규표현식을 사용합니다. 

위 내용을 Sigil에 넣은 후 아래처럼 따라해보세요.

이미지 아래쪽에 빨간색 표시되 부분이 있습니다.


 4200~ 9FA5 + FA00 ~ FAD9


1. 찾기를 불러온 후, ([一-龥]+ ) ([一-龥豈-龎]+)를 찾기 영역에 넣고 

   * ([一-龥]+ )([一-龥豈-龎]+)이건 그냥 외우세요. 어디 적어두면 편합니다. 한일(一) 부터 부를유(龥) 사이에 있는 글자를 의미하는데 유니코드의 코드표에 한자 영역에 해당합니다. 유니코드는 또 뭐지? 하시겠지만, 몰라도 사용하는데 큰 문제 없어요. 궁금하신 분들은 검색~~


   * 아라크네 전병욱님의 문의가 있어 확인해 보니 유니코드 한자 영역을 전부 포함하지 못하는 문제가 있었습니다. 그래서 한자 찾는 식을 업데이트 했습니다.


     ([一-龥豈-龎]+)

    

樂의 기본 코드는 6A02로 一[4E00] ~ 龥[9FA5] 사이에 포함이 되는데 '락'으로 발음을 할 때는 같은 한자라도 F95C 코드로 표현이 됩니다. F95C는 9FA5에 포함되지 않아 '안락사安樂死'는 ([一-龥]+ ) 이 식으로 찾을 수 없었습니다. 그래서 CJK 한자 영역까지 확장을 해서 식을 수정했습니다. 豈-龎의 네모(龎)는 깨진 글자가 아니라 유니코드 FAD9에 해당하는 코드입니다. 이 한자 범위라면 일상에서 사용하는 대부분의 한중일 한자를 찾을 수 있습니다.


2. 방식 항목에서 [Regex]를 선택한 후 [찾기]를 해보세요

   * 한자만 골라서 찾습니다. 찾기를 누를 때마다 한자만 골라서 찾아요. 눈치 빠른 분들이라면 '바꾸기' 하면 끝이네. 하고 생각하셨을거예요 ^^




바꾸기 방법도 약간의 규칙이 있습니다. 먼저 아래 이미지를 보세요.

한자의 색을 빨간색으로 해서 클래스를 하나 만들고, span으로 묶어줄게요.

그러면 바꾸기 영역에 이렇게 입력을 합니다. 


<span class="hanja">\1</span>


여기서 중요한건 \1이라는 식입니다. 

\1은 ([一-龥]+)로 찾은 내용을 그대로 넣으라는 의미예요.


([一-龥]+)로 해서 찾은 부분이 <span class="hanja">\1</span> 이렇게 바뀌게 됩니다. 

300페이지짜리 책 한권 분량을 바꾸는데 10초쯤 걸립니다 ^^(컴퓨터 성능에 따라 시간 차이가 날 수 있어요 ^^)




한자만 바꿀 수 있는거야?

영문도 가능해요.


[A-Za-z] 이렇게 해주면 대문자 A부터 Z까지, 소문자 a부터 z까지 찾아줍니다.

[A-Z]만 하면 대문자 A부터 Z까지 찾아주고 소문자는 찾지 않습니다.

그런데 이렇게만 하면 알파벳 한자씩 찾게 됩니다. 그래서 단어를 찾고싶다면 


[A-Z]+ 이렇게 +를 추가해줍니다.


그리고 Sigil에서 찾아바꾸기를 하고 싶다면 하나의 찾기 묶음이라고 표시하기 위해 괄호에 넣어줍니다.


([A-Za-z]+)


한글을 찾는다면 [가-힣]이 되고, 다른 기호나 그림문자를 찾고 싶다면 유니코드 표를 보시면 되요. 유니코드 표에서 시작되는 지점의 기호와 끝나는 지점의 기호를 대괄호로 묶어주면 됩니다.


#&*@....☞ 이런걸 찾고싶다면 [#-☞] 이렇게 하면 됩니다.



글자 바꾸는게 끝?


편집하는 책이 10개 장으로 나눠져 있고, 각 장마다 10개의 절이 있다면 제목 편집을 어떻게 하세요?

하나 하나 찾아서 110개를 모두 바꿔주시나요?


이렇게 코드를 수정해야 할 때도 정규표현식을 사용합니다.

아래 예를 보세요. 

p 태그로 장 제목이 묶여 있는데 찾아바꾸기로 p 태그 대신 h2 태그로 교체하는 식입니다.

직접 해보세요 ^^


10개의 장과 각 장마다 10개의 절이 있는 책이라도 제목 수정하는데 10초면 됩니다. 패턴을 찾고 식을 세우는 시간까지 고려하면 2~3분정도 걸리고요 ^^


장과 절 제목은 일정한 패턴이 있습니다. 지금까지 편집했던 책 중에 패턴을 찾지 못한적은 한번도 없어요.

간혹 애매한 패턴이 있는데 그럴때는 장 제목과 절 제목 앞에 책에 나오지 않는 적절한 기호를 추가합니다. 예를 들면


===

1장

====

1절


이렇게요. 




이 외에도 정규표현식을 어떻게 쓰느냐에 따라 단순 반복해야 하는 작업을 찾아바꾸기 한번으로 간단히 끝낼 수 있습니다. 

끝으로 제가 전자책 편집을 할 때 자주 사용하는 정규표현식 몇가지를 정리합니다.


  1. 1. 바꾸기 정규표현식으로 찾은 내용을 그대로 넣기
    1. 정규표현식 : \1
    2. 사용
      1. 찾을 내용 : <h2>(.*)</h2>
      2. 바꿀 내용 : <h3>\1</h3>
    3. 설명 : 태그 안의 텍스트는 그대로 <h2> 태그를 찾아 모두 <h3>태그로 바꿔줌.

  2. 2. 태그 내용에 상관 없이 특정 태그 찾기
    1. 정규표현식 : (.*)
    2. 사용
      1. 찾을 내용 : <h2>(.*)</h2> : 내용에 상관 없이 <h2></h2> 모두 찾아줌
      2. 찾을 내용 : <p class="txt_center">(.*)</p> : <p class="txt_center"> 시작하는 문단을 모두 찾아줌
    3. 설명 : 태그 사이에 어떤 내용이 있든 상관 없이 (.*) 앞뒤에 내용이 일치하면 찾아줌
       
  3. 3. 최소로 일치하는 내용
    1. 정규표현식 : (?sU)
    2. 사용
      1. 검색 대상 문단 :
        <p>
        <span class="txt_aut">작가명</span> : <span class="<txt_name">홍길동</span></p>
      2. 찾을 내용 : (?sU)<span class="txt_aut">(.*)</span>
    3. 설명 : 2 식으로 검색 대상 문단을 검색하면 노란색 형광펜 처리한 영역을 찾게 된다. 이럴 최소 일치 영역 (?sU) 설정하면 <span class="txt_aut"> 뒤에 첫번째로 나오는 </span> 찾아준다.

  4. 4. 숫자 찾기
    1. 정규 표현식 : \d, \d\d, \d+
    2. 사용
      1. 검색 대상 문단

<h2>1 정규표현식 숫자 찾기</h2>

<h2>10 정규표현식 숫자 찾기</h2>

  1. 찾을 내용 : \d : 노란색 형광펜 표시 영역을 찾아줌
  2. 찾을 내용 : \d\d : 빨간색 형광펜 표시 영역을 찾아줌
  3. 찾을 내용 : \d+ : 노란색과 빨간색을 모두 찾아줌

 

  1. 설명 : \d 숫자 하나를 의미함. \d\d 두자리, \d\d\d는 세자리… 찾아준다. \d+ 자릿수에 관계 없이 모든 숫자를 찾아준다.

  1. 5. 한글/한자 찾기
    1. [-] [一-龥]



설정

트랙백

댓글


티스토리 툴바