yuns
정규표현식 본문
반응형
- 특수 문자
- 정규식만에서 사용되는 문자
- 공백, 영단어 등
- 일반 문자와 섞어 사용
특수 글자 | 설명 | 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