regex 정리

김동한·2024년 9월 4일
0

자연어처리

목록 보기
13/21

메타문자

메타문자 또는 메타캐릭터는 정규 표현식엔진과 같은 컴퓨터 프로그램에 특별한 의미를 갖는 문자를 의미한다. 아래의 표로 정리할 수 있다.

메타문자설명예시
.임의의 한 문자와 일치 (개행 문자를 제외한 모든 문자)a.baab, acb와 일치
^문자열의 시작을 의미^abcabc로 시작하는 문자열
$문자열의 끝을 의미abc$abc로 끝나는 문자열
*바로 앞의 문자가 0회 이상 반복됨을 의미a*aa, a, 빈 문자열과 일치
+바로 앞의 문자가 1회 이상 반복됨을 의미a+a, aa와 일치
?바로 앞의 문자가 0회 또는 1회 나타남을 의미a?a 또는 빈 문자열과 일치
{n}바로 앞의 문자가 정확히 n회 나타남을 의미a{3}aaa와 일치
{n,m}바로 앞의 문자가 n회 이상, m회 이하 나타남을 의미a{2,4}aa, aaa, aaaa와 일치
[]대괄호 내의 문자 중 하나와 일치[abc]a, b, c와 일치
``OR 연산자. 좌우 중 하나와 일치
()그룹을 정의하거나 캡처링 그룹을 지정(abc)abc와 일치
\이스케이프 문자로, 메타문자 자체를 문자로 취급할 때 사용\.. 문자와 일치
\d숫자와 일치 (0-9)\d0부터 9까지 숫자와 일치
\D숫자가 아닌 문자와 일치\D는 숫자가 아닌 문자와 일치
\w단어 문자와 일치 (영문자, 숫자, 밑줄)\wa-z, A-Z, 0-9, _와 일치
\W단어 문자가 아닌 것과 일치\W는 단어 문자가 아닌 문자와 일치
\s공백 문자와 일치 (공백, 탭, 개행 등)\s는 공백 문자와 일치
\S공백 문자가 아닌 것과 일치\S는 공백이 아닌 문자와 일치
|파이프 문자의 한 쪽에 있는 atom 중 하나를 일치시킵니다A(B|C)D는 ABD 및 ACD와 일치

Flag

플래그설명사용 예시
re.I대소문자를 구분하지 않고 매칭합니다.re.search(r'abc', 'ABC', re.I)는 일치
re.M^$가 문자열의 각 줄마다의 시작과 끝을 의미하게 합니다.re.search(r'^abc', 'abc\ndef', re.M)는 첫 줄의 'abc'와 일치
re.S.이 개행 문자(\n)를 포함한 모든 문자와 일치하게 합니다.re.search(r'a.b', 'a\nb', re.S)는 일치
re.X정규식을 가독성 있게 작성할 수 있도록 공백과 주석을 허용합니다.re.search(r'a\ b', 'a b', re.X)는 일치
re.A\w, \W, \b, \B, \d, \D, \s, \S와 같은 메타문자를 ASCII(영문자)로만 해석합니다.re.search(r'\w', 'é', re.A)는 일치하지 않음
re.L현재 로케일에 맞춰서 정규식 매칭을 수행합니다. (로케일 설정에 따라 언어에 맞춘 매칭이 가능합니다)주로 로케일에 따른 문자 클래스를 사용할 때 유용
re.DEBUG정규식을 디버그 모드로 실행하여 처리 과정을 출력합니다.re.compile(r'a.b', re.DEBUG)는 디버그 정보 출력
re.U정규식에서 \w, \W, \b, \B, \d, \D, \s, \S와 같은 메타문자를 유니코드 표준에 맞춰 해석합니다.파이썬 3에서는 기본적으로 이 플래그가 활성화됨

example

()를 사용해 매칭된 부분을 그룹으로 묶기.

import re

# 이메일에서 사용자 이름과 도메인을 그룹으로 나누기
pattern = r'(\w+)@(\w+)\.(\w+)'
text = 'Contact us at info@example.com.'

match = re.search(pattern, text)
if match:
    print(f"Username: {match.group(1)}")  # 출력: Username: info
    print(f"Domain: {match.group(2)}")    # 출력: Domain: example
    print(f"TLD: {match.group(3)}")       # 출력: TLD: com

여기서 사용된 메타문자는 아래와 같다.

  • \w : 단어문자와 일치
  • \w+ : 단어문자와 일치하는 문자 1개 이상
  • \ : 이스케이프 문자로 바로 뒤의 메타문자를 그냥 문자 자체로 보게 해줌 \. → .
  • () : a@b.c 형식으로 이루어진 email에서 a와 b,c를 각각 그룹화해줌

문자열 분할

import re

# 공백 또는 쉼표로 문자열을 나누기
pattern = r'[ ,]+'
text = 'apple, orange banana,grape'

split_text = re.split(pattern, text)
print(split_text)  # 출력: ['apple', 'orange', 'banana', 'grape']

여기서 사용된 메타문자는 아래와 같다.

  • [] : 대괄호 내 문자 중 하나와 일치. 이때 공백도 포함이다.
  • + : []를 통해서 찾은 일치하는 공백 혹은 쉼표가 한개 이상임을 의미 즉 두칸 띄어 쓰여진 것이나 ,가 여러개요 된다는 뜻

Reference

https://hamait.tistory.com/342

profile
(●'◡'●)

0개의 댓글

관련 채용 정보