yuns

정규표현식 본문

goorm 수업 정리/파이썬

정규표현식

yuuuun 2021. 8. 6. 10:55
반응형
  • 특수 문자
    • 정규식만에서 사용되는 문자
    • 공백, 영단어 등
    • 일반 문자와 섞어 사용
특수 글자 설명  Regex
\w 영숫자 + "_" [A-Za-z0-9_]
\W (영숫자 + "_")를 제외한 문자 [^A-Za-z0-9_]
\d    
\D    
\s    
\S    
\b    
  • 메타 문자
    • 정규식의 문법적인 요소를 담당하는 문자
    • . ^ & * + ? { } [ ] \ | ( )
    • 이 문자들은 특수한 의미의 문자이므로 사용 불가능
    • 사용하고 싶다면 \ 를 붙여서 사용하면 가능
  • 문자 클래스 []
    • [와 ] 사이의 문자들 중 하나와 매칭
    • '-'를 사용하여 범위 지정 가능
    • [a-z] [A-Z0-9][\d\s]
  • 부정 [^]
    • [^와 ] 사이에 없는 문자를 매칭
    • '-'를 사용하여 범위 지정 가능
  • 문자 .
    • 아무 문자나 하나를 매칭
    • 줄 바꿈 문자 \n를 제외
    • ex) \s....\s -> need, hell, walf
  • 0회 이상 *
    • 앞의 문자를 0개 이상 포함
    • ex) ab*c -> abc, abbc, abbbc, abbbc, ac
  • #이모티콘
    • #과 # 사이의 단어만 하려고 하는데 뒤에 더 붙어 있으면 그게 계속 연결되어서 인식함
    • #%[^#]+#
  • 1회 이상 +
    • 앞의 문자를 1개 이상 포함
  • 0또는 1회 ?
    • 앞의 문자가 없을 수도 있음
    • ab?c -> ac, abc
  • 반복 횟수 지정 {m, n}
    • m번 이상 n번 이하 반복
    • 숫자가 하나만 주어질 경우
      • {m}: m번 반복
      • {m,}: m번 이상 반복
      • {,n}: n번 이하 반복
    • ex) 0\d{1,2} - \d{3, 4} - \d{4}: 010-1234-1234
  • Lazy Matching ?
    • 최대한 짧게 매칭하기 위해서는 뒤에 ?를 삽입함
    • 이거보다 #에 써놓은 것으로 하는 것을 권장함
  • 선택 |
    • 여러 식 중 하나를 선택
    • ( )내에 있는 값들 중 선택하는 방식으로 진행
    • (0|\+82-): 0으로 시작하거나 82로 시작하는 것 
  • 단어 경계 \b
    • 단어의 경계 지점인지 확인
    • \babc\b: 단독으로 abc만 있는 것을 찾기 위함
    • \Babc\B: abc 앞뒤에 blank 제외하고 뭔가가 붙어 있는 것을 확인
  • 줄의 시작 ^
    • 줄이나 문자열의 시작점
    • multiline flag필요
    • ^.  -> 줄의 시작의 하나의 문자만 인식
    • ^\w+  -> 줄의 시작의 하나의 단어만 인식 
  • 줄의 끝 $
    • 줄이나 문자열의 끝
    • multiline flag필요
    • \.$ : .으로 끝날 경우 인식
  • 그룹 캡쳐 ( )
    • 괄호이므로 우선순위가 있음
    • 해당 문자열을 캡쳐한다.
    • 캡쳐된 텍스트를 불러올 수 있다
      • \n: n번째 ( ) 안에 들어가 있는 문자열을 캡쳐함
    • (\w{2, }).+\1
      • 2글자 이상 반복된 글자를 캡처하고 그 두 단어 사이에 어떤 값들이 포함되어 있음
      • tomato
      • one-to-one
      • abcdebch
    • (\w{3,})-\1
      • abc-abc
      • bcd-bcd
  • 비 그룹 캡쳐 (?:)
    • 괄호이므로 우선순위가 있음
    • 캡쳐를 하지는 않는다.
    • 그냥 괄호
    • (?:0|\+82-)\d{1,2}-(\d{4})-\1
      • 앞에 있는 애는 선택만 하면 되어서 0 혹은 +82-로 시작하는 값들 중 마지막 4자리가 두번 반복되는 값으로 찾음
  • 뒷 패턴 확인 D(?=R)
    • R이 바로 뒤에 있는 D를 매칭
    • R부분은 포함되지 않음
    • \w+(?=ism) 
      • ism으로 끝나는 단어 중 ism를 제외한 앞의 글자들을 찾고 싶다
  • 앞 패턴 확인 (?<=R)D
    • R이 바로 앞에 있는 D를 매칭
    • R부분은 포함되지 않음
    • (?<=pre)\w+
      • pre로 시작하는 글자들 중 pre를 제외한 뒤의 글자들을 찾고 싶다
  • 이메일 매칭하는 것 찾기
    • 메일 매칭
      • \w+@\w+\.(?:com|net)
    • 메일에 도메인을 포함하는 메일 매칭
      • ^\w*(\w+)\w*@\1\.(?:com|net)$

파이썬에서 사용하기

string = \
"""
010-1234-1234
010-1234-5678
+82-10-5678-5678
+82-4123-1234
"""
pattern = r'^(?:0|+92-)\d)1,2}-(\d{4})-\1$'
import re
for match in re.finditer(pattern, string, re.MULTILINE):
    print('전체 문자열', match.group(0))			#문자열 전체
    print(r"\1 문자열", match.group(1))		  #캡처된 문자열
  • 탐색
#처음으로 매칭되는 문자열 탐색
match = re.search(pattern, string, re.MULTILINE)
print(match.group(0))
  • 모두탐색
#모든 매칭되는 문자열 탐색
for match in re.finditer(pattern, string, re.MULTILINE):
    print(match.group(0))
  • 치환
# 매칭되는 패턴 치환

repl = r"치환됨-\1"
print(re.sub(pattern, repl, string, flags=re.MULTILINE)
  • 나누기
# 매칭되는 패턴을 기준으로 나누기
splited = re.split(pattrn, string, flags = re.MULTILINE)
print(splited)

정규표현식을 평가하는 것은 오래 걸리기 때문에 정규표현식을 미리 컴파일할 경우 더 빠르다

반응형

'goorm 수업 정리 > 파이썬' 카테고리의 다른 글

파일 입출력  (0) 2021.08.06
자료구조, 문자열, 정규표현식  (0) 2021.08.05
문법(2)  (0) 2021.08.04
문법  (0) 2021.08.03
Intro  (0) 2021.08.02
Comments