Published on

정규표현식의 개념과 자주 활용되는 패턴들(with ChatGPT)

Authors
  • 테크버킷
    Name
    테크버킷
    Twitter

정규표현식이란?

정규 표현식(Regular Expression)은 문자열을 처리하는 데 사용되는 패턴(pattern)의 집합입니다. 문자열에서 원하는 문자나 문자열을 찾거나, 치환하거나, 추출하는 작업 등을 수행할 때 유용합니다. 정규 표현식은 각 언어에서 지원하는 문법과 규칙이 있으며, 다양한 프로그래밍 언어에서 지원되고 있습니다.

정규표현식을 활용하면 이메일 주소, 전화번호, URL, HTML태그, 주민등록번호, 우편번호, IP 주소 등 다양한 패턴을 찾거나 추출할 수 있습니다.

정규표현식은 주로 프로그래밍 언어나 텍스트 편집기 등에서 사용되기 때문에 일반인이 배우기에는 조금 까다롭기는 하지만 정규표현식을 악혀두고 이해하고 있으면 다양한 상황에서 유용하게 쓸 수 있습니다.

정규 표현식 예시

정규 표현식(Regular Expression)은 문자열에서 특정한 패턴을 찾거나 추출하는 데 유용한 도구입니다. 이를 쉽게 이해하기 위해서는, 비교적 간단한 예제를 활용하여 설명하는 것이 좋습니다.

예를 들어, "apple"이라는 문자열에서 "app"이라는 부분 문자열을 찾는다고 가정해보겠습니다. 이를 정규 표현식을 사용하지 않고 구현한다면, 다음과 같이 코드를 작성할 수 있습니다.

python
s = "apple"
substring = "app"
if substring in s:
    print("문자열 찾음")
else:
    print("일치하는 문자열이 없음")

이 코드는 "app"이라는 부분 문자열이 "apple" 문자열 안에 있는지를 검사합니다. 만약 "app"이라는 부분 문자열이 있다면, "문자열 찾음"를 출력하고, 그렇지 않으면 "일치하는 문자열이 없음"를 출력합니다.

이번에는 같은 작업을 정규 표현식을 사용하여 수행하는 방법을 살펴보겠습니다. 정규 표현식은 문자열 내에서 패턴을 찾기 위해 사용되는 문자열입니다. 이를 이용하여 위 예제를 다음과 같이 구현할 수 있습니다.

python
import re

s = "apple"
pattern = "app"
if re.search(pattern, s):
    print("문자열 찾음")
else:
    print("일치하는 문자열이 없음")

이 코드는 re.search 함수를 사용하여 문자열 s에서 pattern이라는 패턴을 찾습니다. 만약 패턴이 있다면 "문자열 찾음"를 출력하고, 그렇지 않으면 "일치하는 문자열이 없음"를 출력합니다.

이렇게 보면, 정규 표현식을 사용하여 문자열 처리를 수행하는 것이 상대적으로 불편하게 느껴질 수 있습니다. 하지만, 정규 표현식은 문자열 처리를 수행하는 데 매우 강력한 도구입니다. 예를 들어, "apple", "apricot", "apartment"와 같은 문자열들이 있을 때, "ap"으로 시작하는 모든 단어를 찾는다고 가정해보겠습니다. 이를 정규 표현식을 사용하지 않고 구현한다면, 매우 복잡하고 시간이 많이 걸릴 것입니다. 하지만, 정규 표현식을 사용하면 다음과 같이 간단하게 구현할 수 있습니다.

python
import re

s = "apple apricot apartment"
pattern = "^ap\w+"
matches = re.findall(pattern, s)
print(matches)

위 코드에서 re.findall 함수는 문자열 s에서 패턴 pattern과 일치하는 모든 문자열을 찾아 리스트로 반환합니다. pattern은 ^ap\w+로 시작이 "ap"이고, 그다음으로 w+는 단어 문자(알파벳, 숫자, 언더스코어)가 하나 이상 나타나는 것을 의미합니다. 이를 실행하면, "apple", "apricot", "apartment"와 같은 문자열들이 리스트로 반환됩니다.

즉, 정규 표현식을 사용하면, 문자열 처리를 효율적으로 수행할 수 있습니다. 이를 사용하면, 문자열에서 특정한 패턴을 찾거나 추출하는 것이 더욱 편리해집니다. 또한, 정규 표현식은 다양한 프로그래밍 언어에서 지원되므로, 다양한 언어에서 문자열 처리를 수행할 때 사용할 수 있습니다.

하지만, 정규 표현식은 복잡한 패턴을 작성하는 데 시간이 걸리고, 익히는 데도 노력이 필요합니다. 또한, 정규 표현식이 잘못 작성되었을 때, 예상치 못한 결과를 내놓을 수도 있습니다. 따라서, 정규 표현식을 사용할 때에는, 문법과 규칙을 잘 이해하고, 예제를 참고하여 작성하는 것이 좋습니다.

정규표현식은 무엇으로 이루어져 있을까?

정규표현식은 다음과 같은 요소들로 이루어져 있습니다.

  1. 리터럴(literal): 특정한 문자나 숫자 등을 직접 나타냅니다. 예를 들어, 문자열 "hello"를 정규표현식으로 나타내려면, 그대로 "hello"라고 쓰면 됩니다.

  2. 메타문자(meta character): 특별한 의미를 가지는 문자로서, 패턴을 나타내는데 사용됩니다. 예를 들어, .은 임의의 한 문자를 의미하며, *은 앞의 문자나 문자열이 0번 이상 반복되는 것을 의미합니다.

  3. 문자 클래스(character class): 대괄호([])로 감싸진 문자 집합을 나타냅니다. 예를 들어, [abc]는 "a", "b", "c" 중 하나의 문자를 나타냅니다.

  4. 앵커(anchor): 문자열의 시작과 끝을 나타내는데 사용됩니다. 예를 들어, ^는 문자열의 시작을 나타내며, $는 문자열의 끝을 나타냅니다.

  5. 그룹(group): 괄호(())로 감싸진 패턴을 하나의 그룹으로 묶습니다. 이를 통해, 하나의 그룹으로 묶인 패턴을 반복 또는 추출할 수 있습니다.

  6. 모드(modifier): 정규표현식의 검색 모드를 변경하는데 사용됩니다. 예를 들어, i는 대소문자를 구분하지 않는 검색을 수행하도록 합니다.

위와 같은 요소들로 이루어진 정규표현식을 적절히 조합하여, 특정한 패턴을 찾거나 추출하는 등의 문자열 처리 작업을 수행할 수 있습니다.

메타 문자

정규 표현식은 메타문자라는 특별한 기호를 사용하여 문자열을 처리합니다. 정규 표현식에서 가장 많이 사용되는 메타문자는 다음과 같습니다.

  • . : 어떤 문자 하나를 의미합니다.
  • * : 0개 이상의 문자를 의미합니다.
  • + : 1개 이상의 문자를 의미합니다.
  • ? : 0개 또는 1개의 문자를 의미합니다.
  • [] : 대괄호 안에 들어가는 문자 중 하나를 의미합니다.
  • () : 괄호 안에 들어가는 패턴을 하나의 그룹으로 묶습니다.

이러한 메타문자를 조합하여 다양한 패턴을 만들어내는 것이 가능합니다.

예를 들어, /\d+/라는 표현식을 보겠습니다. \d는 숫자를 의미하며 +는 숫자가 1개 이상 반복된다는 의미의 메타문자입니다. 따라서 /\d+/은 문자열에서 숫자(0~9)가 하나 이상 나타나는 부분을 찾게 됩니다.

자주 사용되는 패턴

아래는 자주 사용되는 몇 가지 패턴과 예시입니다.

  1. 숫자 패턴: \d 숫자를 나타내는 패턴입니다. 예를 들어, /\d+/는 문자열에서 숫자가 하나 이상 나타나는 부분을 찾습니다.

  2. 문자 패턴: \w 알파벳과 숫자, 언더스코어(_)를 포함하는 단어를 찾습니다. 예를 들어, /\w+/는 문자와 숫자, 언더스코어를 포함하는 단어를 찾습니다.

  3. 공백 패턴: \s 공백 문자(스페이스, 탭, 개행 등)를 찾습니다. 예를 들어, /\s+/는 문자열에서 하나 이상의 공백 문자를 찾습니다.

  4. 대문자 패턴: [A-Z] 대문자 알파벳을 찾습니다. 예를 들어, /[A-Z]+/는 문자열에서 대문자 알파벳이 하나 이상 나타나는 부분을 찾습니다.

  5. 소문자 패턴: [a-z] 소문자 알파벳을 찾습니다. 예를 들어, /[a-z]+/는 문자열에서 소문자 알파벳이 하나 이상 나타나는 부분을 찾습니다.

  6. 특수문자 패턴: [^A-Za-z0-9] 알파벳과 숫자를 제외한 모든 문자를 찾습니다. 예를 들어, /[^A-Za-z0-9]+/는 문자열에서 알파벳과 숫자를 제외한 모든 문자가 하나 이상 나타나는 부분을 찾습니다.

  7. 이메일 패턴: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ 이메일 주소를 찾습니다. 이 패턴은 이메일 주소의 규칙을 나타내는 정규 표현식입니다. /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/도 이메일 주소를 찾는 패턴으로 자주 사용됩니다.

  8. 전화번호 패턴: ^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}$

  9. URL 패턴: https?://[\w\.-]+(/[\w\.-]*)*

  10. HTML 태그 : https?://[\w\.-]+(/[\w\.-]*)*

정규표현식을 지원하는 프로그램

정규표현식은 어디에서 쓸 수 있을까요? 프로그래밍 언어, 텍스트 편집기, 데이터베이스, 검색 엔진 등에서 주로 지원됩니다. 아쉽게도 MS 워드, 한글과 같은 워드프로세서에서는 일반적으로 정규표현식을 지원하지 않습니다.

텍스트 편집기

대표적인 텍스트 편집기인 Sublime Text, Atom, Visual Studio Code 등은 정규표현식을 지원합니다. 이들 편집기를 이용하여 텍스트를 검색하거나 처리할 수 있습니다.

프로그래밍 언어

정규표현식은 대부분의 프로그래밍 언어에서 지원됩니다. 예를 들어, Python, Java, JavaScript 등의 언어에서 정규표현식을 사용할 수 있습니다.

데이터베이스

데이터베이스에서도 정규표현식을 사용할 수 있습니다. 예를 들어, MySQL에서는 정규표현식을 사용하여 데이터를 검색하거나 필터링할 수 있습니다.

커맨드 라인 도구

Linux나 macOS에서는 grep이나 awk 같은 커맨드 라인 도구를 이용하여 정규표현식을 사용할 수 있습니다. 이들 도구를 이용하여 텍스트 파일에서 원하는 패턴을 검색하거나 추출할 수 있습니다.

구글 WorkSpace

구글 폼의 텍스트 형식에서 "데이터 유효성 검사" 옵션을 선택하여 입력값을 제한하거나 유효성을 검사할 수 있습니다. 예를 들어, 전화번호를 입력받는 폼에서 ^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}$과 같은 정규표현식을 사용하면 전화번호의 형식만 입력 가능하도록 할 수가 있습니다.

Chat GPT 활용하기

인공지능 챗봇인 Chat GPT를 활용하여 정규표현식의 활용능력을 높일 수가 있습니다. 아래에 몇가지 유용한 프롬프트 사례를 소개합니다.

정규표현식 요청

'한글단어'와 하이픈(-) 그리고 숫자로 이루어진 문자 패턴을 찾을 수 있는 정규표현식을 알려줘.
ChatGPT
gpt
"한글단어-숫자" 형태의 문자열 패턴을 찾을 수 있습니다.
예를 들어, "강남구-123"과 같은 문자열은 위 정규표현식에 일치하며, "강남구"는 한글단어, "-"는 하이픈, "123"은 숫자로 이루어진 패턴입니다.

파이썬 코드 작성 요청

page.html을 열어서 'http://techbukket.com/xxx/xxxx' 와 같은 링크 주소가 있다면 '/xxx/xxxx' 로 바꿔주는 파이썬 코드를 작성해줘.
ChatGPT
gpt
다음은 BeautifulSoup과 정규표현식을 사용하여 'http://techbukket.com/xxx/xxxx'와 같은 시작하는 링크 주소를 '/xxx/xxxx'로 변경하는 파이썬 코드 예시입니다.
import re
from bs4 import BeautifulSoup

# page.html 파일을 읽어옵니다.

with open('page.html', 'r', encoding='utf-8') as f:
page = f.read()

# BeautifulSoup을 사용하여 HTML 태그를 파싱합니다.

soup = BeautifulSoup(page, 'html.parser')

# 모든 a 태그를 찾습니다.

for a in soup.find_all('a'):
href = a.get('href')
if href and re.match(r'http://techbukket.com/.*', href): # 정규표현식을 사용하여 시작하는 링크 주소를 추출합니다.
path = re.sub(r'^http://techbukket.com', '', href) # 추출된 주소를 변경합니다.
new_href = '/' + path # 변경된 주소로 업데이트합니다.
a['href'] = new_href

# 변경된 HTML 코드를 파일로 저장합니다.

with open('updated_page.html', 'w', encoding='utf-8') as f:
f.write(str(soup))

위 코드에서는, BeautifulSoup을 사용하여 HTML 태그를 파싱한 후, 모든 a 태그를 찾습니다. a 태그의 href 속성이 'http://techbukket.com/'로 시작하는 경우, 정규표현식을 사용하여 시작하는 링크 주소를 추출합니다. 추출된 주소를 변경한 후, a 태그의 href 속성을 변경된 주소로 업데이트합니다. 마지막으로 변경된 HTML 코드를 파일로 저장합니다.

Javascript 코드 작성 요청

파일이름의 리스트에서 문자열이 xxx.jpg 혹은 xxx.jpg 로 끝나는 것만 찾아주는 자바스크립트 코드
ChatGPT
gpt
다음은 파일이름의 리스트에서 문자열이 xxx.jpg 혹은 xxx.jpg 로 끝나는 것만 찾아주는 자바스크립트 코드 예시입니다.
// 파일이름 리스트를 정의합니다.
var fileNames = ['image1.jpg', 'image2.jpg', 'document.pdf', 'image3.jpg'];

// 정규표현식을 사용하여 jpg 또는 png 파일을 찾습니다.
var jpgOrPngFiles = fileNames.filter(function(fileName) {
return /\.(jpg|png)$/.test(fileName);
});

// 결과를 출력합니다.
console.log(jpgOrPngFiles); // ["image1.jpg", "image2.jpg", "image3.jpg"]
위 코드에서는, 파일이름 리스트를 정의한 후, filter 함수를 사용하여 정규표현식을 적용합니다. 정규표현식 /\.((jpg)|(png))$/은 .jpg 또는 .jpg 로 끝나는 문자열을 찾습니다. 이를 test 함수와 함께 사용하여 파일이름 리스트에서 .jpg 또는 .jpg 파일만 추출합니다. 추출된 결과는 jpgOrPngFiles 변수에 저장되며, 이를 출력합니다.