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

Tip&Tech 2016. 1. 21. 16:31

정규표현식을 아시나요?

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

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


개발자나 쓰는걸 왜?


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


\d

[A-Za-z]

(.*)

[\x{4E00}-\x{9FFF}]


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

이런게 전자책 편집하고 무슨 상관이 있나 싶어 창을 닫는다면 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에 해당하는 코드입니다. 이 한자 범위라면 일상에서 사용하는 대부분의 한중일 한자를 찾을 수 있습니다.


유니코드를 사용하려면

([\x{4E00}-\x{9FFF}])


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. [-] [一-龥]



설정

트랙백

댓글

  • cpt.jeon 2016.02.01 11:41 ADDR 수정/삭제 답글

    차장님 안녕하세요. 먼저, 유용한 팁 알려주셔서 정말 감사드립니다. 저는 아라크네 출판사에서 전자책을 담당하고 있는 전병욱이라고 합니다. 페이스북을 통해 유용한 정보 잘 얻고 있습니다. 혹시 기억하실런지요? ^^ 본론을 말씀드리자면, 위에서 알려주신 한자 바꾸기를 해보았는데요. 이런 경우는 중간 글자가 빠지더라고요.

    안락사安樂死

    중간에 '樂'자가 잡히질 않던데, 이런 경우는 유니코드표에서 지정한 범위(一-龥) 외의 것이라고 봐야 할까요?

    • 전자책 제작과 편집에 관한 모든 정보 내.맘.대.로 2016.02.01 19:16 신고 수정/삭제

      樂자는 유니코드 [6A02]기 때문에 一[4E00] ~ 龥[9FA5] 사이에 포함되는 한자예요.

      그런데 발음이 樂자가 발음이 3개잖아요. '락'으로 읽힐때는 F95C로 범위 밖으로 표시가 됩니다. 저도 문의 주신 글보고 찾아보고 나서 알게 됐어요.

      ○ 간단한 해결 방법
      '안락사'를 한자로 치환하지 마시고 안악사를 한자로 치환해 보세요. '락'을 한자로 치환하면 F95C 코드로 바뀌고, '악'을 한자로 치환하면 6A02 코드로 치환이 됩니다. 같은 글자지만 발음에 따라 코드가 달라서 그래요.

      ○ 확실한 해결방법
      ([一-龥豈-龎]+)
      이건 유니코드 4200~ 9FA5 + FA00 ~ FAD9까지 CJK 한자 코드 영역을 추가시킨거예요. 龎 이 글자가 네모로 보일 수는 있지만 FAD9 코드에 해당하는 글자여서 그대로 복사하시면 됩니다.

    • 전자책 제작과 편집에 관한 모든 정보 내.맘.대.로 2016.02.01 19:18 신고 수정/삭제

      樂자는 유니코드 [6A02]기 때문에 一[4E00] ~ 龥[9FA5] 사이에 포함되는 한자예요.

      그런데 발음이 樂자가 발음이 3개잖아요. '락'으로 읽힐때는 F95C로 범위 밖으로 표시가 됩니다. 저도 문의 주신 글보고 찾아보고 나서 알게 됐어요.
      (250자 제한이라 자세한 설명은 아래쪽을 봐주세요 ^^;)

    • cpt.jeon 2016.02.02 10:48 수정/삭제

      답변 감사드립니다.

      설명 중에 '樂자가 발음이 3개잖아요.'에서 한참 고민했습니다. ㅋㅋ

      '즐기다'의 '락', '낙' 하고, '노래'를 나타낼 때 '악' 이런 음독(音讀)을 말씀하시는 거였군요.

      자세히 설명해 주셔서 무슨 말인지 잘 알게 되었습니다. 그런 생각은 못했었는데, 한글을 한자로 치환할 때 '악'으로 할 때와 '락'으로 할 때, '樂'자의 코드가 다르다는 게 큰 공부가 되었습니다. 단순히 이 문제를 해결하는 데도 도움이 되었고, 유니코드라는 게 이러한 구조로 이루어 졌다는 것도 알게 되었어요.

      정말 감사드립니다.

      유용한 정보가 너무 많아서 자주 들르겠습니다.^^

    • 전자책 제작과 편집에 관한 모든 정보 내.맘.대.로 2016.02.03 12:01 신고 수정/삭제

      저도 생각 못했던 부분인데 문의 주셔서 공부가 됐네요. 마침 ODPF(www.odpf.or.kr)에서 '한글글꼴등록시스템을 위한 한글코드세트' 단체표준을 내놨습니다. 심사중인데 조만간 등록될 것 같아요. CJK 한글 한자 뿐 아니라 기호까지 포함해서 코드 범위와 코드값이 잘 정리돼 있는데 참고하시면 도움이 될 것 같습니다 ^^

  • 골드 2016.06.09 15:16 ADDR 수정/삭제 답글

    질문 있습니다. 영문 단어를 찾을 때 태그 안쪽까지 검색하던데 태그 외부 내용만도 검색이 가능한가요?

    • 전자책 제작과 편집에 관한 모든 정보 내.맘.대.로 2016.06.10 15:25 신고 수정/삭제

      질문을 정확히 이해하지 못했습니다. 태그 안쪽, 태그 외부에 대한 추가 설명좀 해주세요.

      <p>이 영역을 태그 안쪽이라고 하신건가요?</p>

      아니면

      <p span=".." 이 영역을 태그 안쪽이라고 하신건가요?>

      정규표현식 자체는 태그를 구분하지 않고 텍스트 모두를 검색 대상으로 합니다. 특정 단어나 태그 같은 패턴을 제외시키고 싶다면 정규표현식을 써서 제한을 둘 수 있습니다.

      원하는 내용을 구체적으로 다시 알려주시면 확인해 보겠습니다.

  • 골드 2016.06.11 08:23 ADDR 수정/삭제 답글

    <p class="ddf">가나다 abc 입니다</p>
    영문 단어만 찾아서 변경하고 싶었습니다. 특정 단어같은 패턴이 없어서 본문 내용에서만 찾고 싶었는데 영어는 태그를 구분하지 않고 검색하는것 같아서 아쉽더라고요.
    혹시 방법이 있는가 해서 여쭤 봤습니다.

  • Chimnae 2020.11.11 10:02 ADDR 수정/삭제 답글

    찾기에 쓰이는 왼쪽 대괄호[ 와 오른쪽 대괄호] 는 어떻게 찾나요?
    납폐納幣[92] 에서 [를 차자아 92를 사용하고 싶습니다.