본문 바로가기

홈/편집·보기

패턴으로 찾기, 바꾸기 ② 워드의 패턴 표현식

찾기, 바꾸기를 할 때 참고사항

  • ○ 이 포스트는 [일반 텍스트 찾기, 바꾸기], [패턴으로 찾기, 바꾸기]를 위한 예시입니다. 대화상자나 옵션 설정 방법은 해당 포스트를 참고하기 바랍니다.
  • 역슬래시 \는 맑은 고딕 등 일부 한글 글꼴에서 원화 기호 ₩로 표시됩니다. 이 포스트를 Windows에서 볼 때는 역슬래시 \\로 표시됩니다.
  • ○ 모두 바꾸기(A)로 일괄변경하면 예상하지 못하게 바뀌는 것이 꼭 있고, 패턴 검색으로 모두 바꾸기를 하면 워드 프로그램이 다운되기도 합니다. 번거롭더라도 바꾸기(Alt+R)을 눌러 하나씩 넘겨가며 확인하는 것이 좋습니다.
  • ○ 각주, 메모를 포함한 문서 전체에서 찾아 바꾸기를 하기 위해서는 본문 시작 부분에서 검색 방향을 '문서 전체'로 하고 찾아야 합니다. 찾아 바꾸기가 중간에 끊기거나 검색 방향을 '아래쪽으로'로 하면 각주나 메모를 누락할 수 있습니다[2.3.2 텍스트를 누락하지 않고 찾아 바꾸는 방법].
  • ○ 변경 추적을 켜 놓은 상태에서 패턴 일치(와일드카드) 사용(U) 기능을 사용하면 오류가 발생합니다. 패턴으로 검색할 때는 변경 추적 기능을 꺼 놓아야 합니다.

3. 워드의 패턴 표현식

워드 패턴은 정규표현식과 똑같지도 않고 그렇다고 많이 다른 것이 아니어서 상당히 헷갈립니다[2.1 기본 표현식 - 정규표현식과 비교] . 워드 패턴 표현식과 정규표현식의 차이를 요약하면 다음과 같습니다.

표현 정규표현식 워드 패턴 비고
문자(문장 부호 및 공백 포함) 1개 . ? 단락 나누기 ↵까지 포함한 모든 문자
문자(문장 부호 및 공백 포함) 0개 이상 .* * '앞의 문자 0개 이상'이 아닌 '아무개 문자 0개 이상'
1개 이상의 글자 + @ 앞의 문자 1개 이상
숫자 \d [0-9]  
알파벳 [a-zA-Z] [a-zA-Z]  
한글 [가-힣] [가-힣] 한글 음절 블럭의 시작(가)부터 끝(힣)까지의 문자 집합
한자 [一-龥] [一-龥] 한중일 통합한자 블럭의 시작(一)부터 끝(龥)까지의 문자 집합
범위 […]
[  -  ]
[]
[  -  ]
 
해당하지 않는 글자 [^…] [!]  
그룹 지정 (…) ()  
패턴과 일치한 텍스트(전부) $0 ^&  
패턴과 일치한 텍스트(그룹) $1 $2 … \1 \2  
앞 문자를 n회 반복 {n} {n} {,m}은 오류가 발생하므로 {1,m}처럼 최솟값 명시해야 함
앞 문자를 n회 이상 m회 이하 반복 {n,m} {n,m}
앞 문자를 n회 이상 반복 {n,} {n,}
문자열의 처음 ^… (없음) 워드 패턴의 시작과 끝 문법은 대상문자열(=워드의 문서 전체)이 아닌 공백으로 나누어진 단어를 기준으로 함
문자열의 끝 …$ (없음)
단어의 시작 (없음) <
단어의 끝 (없음) >
또는 …|… (없음)  

3.1 특수한 기능을 하는 문자

일반 텍스트 검색과 마찬가지로 패턴 검색에서도 대부분의 문자는 그 문자 그대로 사용됩니다. 패턴에 1을 입력하면 '1'을 찾고, %를 입력하면 '%'를 찾습니다.

그러나  [ ] { } < > ( ) - @ ? ! * \ 는 그룹, 반복 등 워드 패턴을 표현하는데 사용되는 문자로서 그대로 사용할 수 없습니다. 이 문자를 그대로 사용하려면 문자 앞에 이스케이프 문자 \를 붙여야 합니다. 워드 패턴에서 ?를 쓰면 문자 "?"이 아니라 "어떤 문자 1개"를 의미하므로, 만약 문자 "?"를 찾는 것이라면 패턴 검색에서는 \?로 표시해야 합니다.

워드 패턴에서는 다음의 사항을 참고하면 좋습니다.

  • 워드 패턴의  [ ] { } < > ( ) - @ ? ! * \ 는 정규표현식의 메타문자인  . ^ $ * + ? {} [] \ | () 과 조금씩 다르다보니 쓰다 보면 헷갈릴 때가 많습니다. [찾기 및 바꾸기 대화상자]의 옵션(E)을 누르면 뜨는 목록에 메타문자에 대한 간략한 설명도 포함되어 있으니 목록에서 확인하고 입력하면 됩니다.
  • 맑은 고딕, 바탕(체), 굴림(체) 등의 글꼴에서 이스케이프 문자 \는 원화 기호 ₩로 표시됩니다[기호(특수문자) 입력 5.3 원화 기호 ₩]. 워드의 기본 언어가 한국어로 설정되어 있으면 [찾기 및 바꾸기 대화상자]에서도 \이 아닌 원화 기호 ₩로 표시됩니다.
  • 캐럿 기호 ^는 이스케이프 문자처럼 쓰이기도 합니다. 또한 패턴에서 캐럿 기호는 \^가 아닌 ^^로 표시합니다.

3.2 와일드카드 ? *

와일드카드(아무개 문자, wildcard) ?는 '어떤 문자 1개'를 의미합니다. 알파벳, 숫자, 한글은 물론 공백이나 서식 기호까지 포함합니다. 정규표현식의 .와 달리 줄 바꿈(단락 나누기)도 포함합니다.

  • b?t로 검색하면 b와 t 사이에 1개의 문자가 있는 bat, batman, bet, bot, bottom 모두 찾습니다. bunt, bacteria는 b와 t 사이에 2개의 문자가 있으므로 해당하지 않습니다.

아무개 문자 *는 '어떤 문자 0개 이상'을 의미합니다. 아무것도 없어도 되고(0개), 100개이어도 됩니다. 정규표현식의 *은 앞의 문자가 반복되는 것이지만, 워드 패턴에서는 어떤(모든) 문자가 반복되는 것을 의미합니다.

  • b*t로 검색하면 b와 t 사이에 아무 문자도 없는 bt, 1개의 문자가 있는 bat, batman, 2개의 문자가 있는 bunt, bacteria 모두 찾습니다.

아무개 문자 *는 해당되는 문자나 반복되는 횟수에 제한이 없으므로 사용할 때 주의하여야 합니다.

  • 서식 기호도 포함되므로 가령 다*마로 검색하면 "…입니.↵ (다음 단락) 지막으로"와 같이 앞·뒤 단락에 걸쳐 있는 경우도 찾게 됩니다.
  • *를 써서 찾아 바꾸기를 할 때 하나하나 확인하지 않고 모두 바꾸기(A)를 하면 예상하지 못하게 텍스트를 날릴 수 있습니다.

3.3 범위 [  ]

대괄호(Square Brackets) [  ]는 '대괄호 안의 문자 중 1개'를 의미합니다. 찾는 문자를 일일이 쓰지 않고 하이픈 -로 간단히 범위로 지정할 수 있습니다. 범위 [  ]의 기본 문법은 정규표현식과 동일합니다.

  • [abc]a, b, c 중 하나를 의미합니다. w[io]n으로 찾으면 won, win 모두 해당합니다.
  • [0123456789]0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중 1개이므로 숫자를 의미합니다. 하이픈 -을 써서 [0-9]처럼 간단히 범위로 나타낼 수 있습니다.
  • [a-z]는 a부터 z까지 소문자 알파벳 중 1개를 의미합니다. [A-Z]는 대문자 알파벳 1개를 의미하고, [a-zA-Z]로 쓰면 대/소문자를 모두 포함합니다.
  • 유니코드의 한글 음절 블럭은 가(U+AC00)부터 힣(U+D7A3)까지 있습니다. 따라서 한글 문자 1개는 [가-힣]으로 표현합니다. 현대 한글 자모까지 포함하려면 [ㄱ-ㅣ가-힣]으로 쓰면 됩니다.
  • 한자 문자 1개는 한중일 통합한자 블럭의 一(U+4E00)부터 龥(U+9FA5)까지의 문자 중 하나이므로 [一-龥]로 씁니다.

하이픈 -으로 범위를 지정할 때는 코드번호가 낮은 문자를 먼저 써야 합니다. 어느 문자의 코드번호가 더 낮은지 알지 못할 때에는 그 문자들 중 하나를 블럭지정한 후 Alt+I+S로 [기호 대화상자]를 열어 찾는 문자들의 순서를 확인하면 됩니다.

[3.3.A] 코드번호가 더 높은 9를 먼저 쓰면 "[찾을 내용]에서 지정한 범위가 잘못되었습니다"의 오류가 나옵니다.
[3.3.B] 9를 블럭지정하고 Alt+I+S로 [기호 대화상자]를 열면 숫자의 코드번호가 0부터 시작하는 것이 확인됩니다.

3.4 제외 [! ]

대괄호 [  ]!으로 시작하면 '대괄호 안의 문자를 제외한 문자 중 1개'를 의미합니다. 정규표현식의 ^는 워드 패턴에서 Not이나 Start of String이 아니라 이스케이프 문자처럼 쓰입니다.

  • [!abc]는 a 또는 b 또는 c가 아닌 문자를 의미하므로, d, e는 여기에 해당합니다.
  • [!0-9]는 숫자가 아닌 문자, [!a-zA-Z]은 알파벳이 아닌 문자, [!가-힣]은 한글이 아닌 문자를 의미합니다.

3.5 앞 문자 1번 이상 반복 @  {1,}

@는 '앞 문자가 1번 이상 반복'되는 것을 의미합니다. 정규표현식에서 사용하는 +는 워드 패턴에서는 그냥 문자입니다.

그런데 워드 패턴은 정규표현식과 달리 조건을 충족하는 최소한의 범위만 찾습니다(lazy, not greedy). 가령 "간장 공장 공장장은 강 공장장이고"를 정규표현식 공장+로 검색하면 "간장 공장 공장장은 강 공장장이고"처럼 '장'이 1개 이상인 '공장', '공장장'이 전부 나오지만, 워드 패턴에서 공장@으로 검색하면 "간장 공장 공장장은 강 공장장이고"처럼 '장'이 1개인 '공장'만 나옵니다.

정규표현식과 같은 '앞 문자 1개 이상'은 @ 대신 {1,}로 쓰는 것이 낫습니다. 워드 패턴에서는 정규표현식의 * 같이 '앞 문자 0회 이상 반복'에 해당하는 메타문자는 없습니다.

3.6 앞 문자 0번 이상 반복

정규표현식의 *는 '앞 문자 0번 이상 반복'입니다. 앞 문자가 없거나(0번) 있거나(1번 이상)를 표현하는 것으로서, 아주 간단히 OR를 표현할 수 있습니다.

그러나 워드 패턴은 '앞 문자 0번 이상 반복'이 없습니다. 와일드카드 *는 앞 문자가 아닌 '아무개 문자'가 0번 이상 반복되는 것이고, @는 앞 문자가 '1번 이상 반복'되는 것입니다. (  |  )도 쓸 수 없기 때문에 워드 패턴에서 OR를 표현하기가 어렵습니다.

3.7 앞 문자 여러 번 반복 {n,m}

중괄호(Curly Brackets} {  }은 앞의 문자가 반복되는 횟수의 최솟값(n)과 최댓값(m)을 직접 지정할 수 있습니다. {2,}처럼 최댓값은 생략할 수 있습니다.

  • a{2}는 aa를 의미합니다. a{2,}는 a가 2개 이상이므로 aa, aaa, aaaa, aaaaa, …이 모두 해당하고, a{2,4}는 a가 2개 이상 4개 이하이므로 aa, aaa, aaaa가 해당합니다.
  • 10{1,3}은 중괄호 앞의 문자인 숫자 0이 1번 이상 3번 이하 반복되는 패턴으로 10, 100, 1000이 해당합니다.
  • 날짜의 월이나 일은 숫자는 1자리 또는 자리일 수 있습니다. 이때는 [0-9]{1,2}월로 표현하면 됩니다.

문자 1개가 아니라 여러 개의 문자(문구)를 반복하려면 소괄호 (  )로 묶으면 됩니다.

  • (너무){2,3}은 '너무'가 2번 이상 3번 이하 반복되는 것으로서 너무너무, 너무너무너무가 해당합니다.
  • 10{1,3}은 중괄호 바로 앞의 문자 '0'이 반복되는 10, 100, 1000이지만, (10){1,3}은 소괄호로 묶인 '10'이 반복되는 10, 1010, 101010입니다.

정규표현식과 달리 최솟값을 비워둘 수 없습니다. 정규표현식에서 a{,5}는 a가 '0개 이상(없거나) 5개 이하'로 해석되지만, 워드 패턴은 0번 이상 반복이 없어서 "[찾을 내용]에서 지정한 패턴 일치 조건이 잘못되었습니다"는 에러메시지가 나옵니다. 워드 패턴에서는 a{1,5}처럼 최솟값을 1이상의 수로 반드시 입력해야 합니다.

3.8 단어의 시작과 끝 < >

단어의 시작은 <로, 단어의 끝은 >로 표시하여 찾는 텍스트의 위치를 한정할 수 있습니다. 정규표현식의 ^$는 대상문자열의 시작과 끝이지만, 워드에서 대상문자열은 '문서 전부'라서 정규표현식과 같은 기능은 필요 없습니다. 워드에서는 <>패턴을 사용하여 단어의 시작과 끝을 조건으로 넣습니다. 반드시 하나의 단어일 필요는 없고 공백이 있는 문구도 포함됩니다.

  • <사*가>사업시행계획인가 , 사업시행계획(변경)인가 , 사업시행계획 변경인가  모두 해당합니다. 다만 '단어'이어야 하므로 바로 조사가 붙지 않고 앞·뒤로 공백이나 따옴표 같은 기호가 있어야 이 패턴으로 찾을 수 있습니다.
  • 단어의 시작 < 또는 끝 > 중 하나만 써서 접두어나 접미어를 찾을 수도 있습니다[일반 텍스트 찾기, 바꾸기 2.8.6 단어 단위로(Y), 접두사 일치(X), 접미사 일치(T)].

3.9 그룹화 ( )

소괄호(Round Brackets) (  )는 패턴을 그룹으로 지정하는 것입니다.

우선 간단한 용도로는, 문자 1개가 아닌 여러 문자를 그룹으로 묶어 반복할 수 있습니다.

  • (너무){2,3}은 '너무'가 2번 이상 3번 이하 반복되는 것으로서 너무너무, 너무너무너무가 해당합니다.
  • 10{1,3}은 중괄호 바로 앞의 문자 '0'이 반복되는 10, 100, 1000이지만, (10){1,3}은 소괄호로 묶인 '10'이 반복되는 10, 1010, 101010입니다.

정규표현식처럼 그룹을 지정하여 바꾸기(치환)를 할 수 있습니다. 이 기능은 텍스트의 순서를 바꾸거나 텍스트 일부만을 바꿀 때 유용합니다. 개별 그룹은 정규표현식처럼 이스케이프 문자 \에 숫자를 붙여 \1, \2, … 처럼 표시하지만, 찾은 문자열(전체)은 ^&로 표시합니다. ?:?<name>와 같은 기능은 없습니다.

  • "Gildong Hong"을 소괄호 (  )를 써서 (Gildong) (Hong)으로 묶으면 1번 그룹(첫번째 소괄호 안 텍스트)은 Gildong이고, 2번 그룹(두번째 소괄호 안 텍스트)은 "Hong"이 됩니다. 바꿀 내용에 "2번 그룹 + 쉼표 1개 + 공백 1개 + 1번 그룹"을 의미하는 \2, \1을 입력하면 "Hong, Gildong"으로 바뀝니다.
  • 문서에서 "Gildong Hong"과 같은 영문 이름 패턴은 "단어의 시작 + 대문자 1개 + 소문자 1개 이상 + 공백 1칸 + 대문자 1개 + 소문자 1개 이상 + 단어의 끝"으로 찾을 수 있습니다. [찾기 및 바꾸기 대화상자]의 찾을 내용(F)에 <([A-Z][a-z]@) ([A-Z][a-z]@)>을 입력하고 바꿀 내용(I)에 \2, \1을 입력하면 "Gildong Hong"과 같은 패턴의 영문 이름이 "Hong, Gildong"처럼 앞·뒤가 바뀝니다.

3.10 캐럿 기호 ^

워드 패턴에서 단락 나누기 ↵는 ^p, 줄 바꿈 ↓은 ^l, 탭은 ^t처럼 서식 기호나 특수문자는 캐럿 기호에 문자를 붙여 표시합니다[찾기, 바꾸기 2.6 서식기호, 특수문자 입력하기].

또한 캐럿 기호 ^는 정규표현식의 \와 유사한 기능을 수행합니다. 가령 'a'는 정규표현식에서 16진법으로 \u0061 또는 \x61로 표현하지만, 워드에서는 캐럿 기호 ^에 10진법으로 변환한 코드 번호 97을 붙여 ^97(10진법)로 표현할 수 있습니다.

원래 단락 나누기의 캐럿 코드인 ^p는 일반 텍스트 검색에서만 사용할 수 있고 패턴 검색에서는 사용할 수 없습니다. 그러나 캐럿 기호 ^에 Carriage Return인 0x0D(=13)의 13을 붙여 ^13으로 표현할 수 있습니다. 그 이외에 원래의 캐럿 코드를 사용할 수 없는 구역 나누기, 각주 표시 등도 제어 문자(Control character)의 코드를 붙여 사용할 수 있습니다[패턴으로 찾기, 바꾸기 2.2 서식 기호].

이렇게 캐럿에 코드 번호를 붙여 캐럿 코드를 만드는 것은 확장ASCII 범위인 255(0xFF)까지입니다. 그리고 128부터 255까지는 ^0128처럼 코드 번호 앞에 0을 붙여야 합니다.

3.11 또는 |

정규표현식은 (abc|def)처럼 파이프라인 |를 '또는'으로 쓸 수 있지만, 워드 패턴에서는 이런 기능이 없습니다. 워드 패턴에서 |는 단순한 문자입니다.

3.12 패턴으로 검색할 때 주의사항

워드 패턴은 대/소문자를 구분합니다(case sensitive). [찾기 및 바꾸기 대화상자]에서 일반 텍스트를 찾을 때에는 기본적으로 대/소문자를 구분하지 않고 검색 옵션에서 대/소문자 구분(H)을 체크해야 대/소문자를 구분합니다[찾기, 바꾸기 2.8.5 대/소문자 구분]. 그러나 패턴 일치(와일드카드) 사용(U)을 켜고 패턴으로 찾을 때에는 정규표현식과 마찬가지로 대/소문자를 구분합니다. i 플래그 같은 옵션은 넣을 수 없습니다.

워드 패턴은 조건을 충족하는 최소한의 범위만 찾습니다(lazy, not greedy).

  • 가령 문자열 'xyyyyyy' 을 대상으로 정규표현식 xy+으로 찾으면 문자열 xyyyyyy 전부가 검색되지만, 워드 패턴에서 같은 표현인 xy@으로 찾으면 xy만 선택됩니다. 워드에서 특히 반복되는 문자열을 찾아 바꾸기할 때 누락하는 일이 종종 발생합니다.
  • 소괄호로 둘러싼 텍스트를 찾기 위해 정규표현식 \(.+\)으로 찾으면 탐욕적으로 문자열의 다른 괄호 쌍까지 넘어가기 때문에 \([^)]\)처럼 명시적으로 제한을 두기도 합니다. 그러나 워드 패턴에서는 \(*\)정도로만 써도 됩니다.

패턴으로 찾아 바꾸기를 할 때는 변경추적기능을 꺼두어야 합니다. 일반 텍스트 검색과 달리 패턴 검색은 변경추적기능이 켜져 있는 상태에서는 오류가 발생합니다.

긴 문서에서 패턴을 사용하여 모두 바꾸기(A)를 하면 프로그램이 다운될 수 있습니다. 문서가 길 때는 Alt+R를 계속 눌러 하나씩 빠르게 바꾸기를 하는 것이 안정적이고 더 빠릅니다.

워드 패턴은 너무 복잡하면 기능 자체가 제한됩니다. 패턴의 길이(글자수)보다는 복잡도의 문제인 것 같은데 "[찾을 내용]의 패턴 일치 조건이 너무 복잡합니다."는 에러메시지가 뜨면서 찾기 기능 자체가 되지 않습니다.

※ 참고 사이트

 

Finding and replacing characters using wildcards

Finding and replacing characters using wildcards Article contributed by Graham Mayor, with thanks also to Klaus Linke Contents Overview Wildcards are like the blank pieces in Scrabble, or like the Jokers you can use in some card games to stand in for any c

wordmvp.com

 

최초 게시: 2023. 2. 27.