python 정규표현식 regular expression - 1 (메타문자)
정규표현식이란?
-
복잡한 문자열을 처리할 때 사용하는 기법
-
파이썬뿐만 아니라 문자열을 처리하는 모든 곳에서 사용한다
-
정규표현식은 복잡한 규칙을 가지고 있는 문자열을 간단한 코드로 처리할 수 있게 해준다
-
예시
name = "Leahyoo Ychaen Chae" # 처음글자만 두고 나머지 글자의 자리를 **처리하고 싶다면 listA = name.split(' ') listB = [] for char in listA : listB.append(char[0]+(len(char)-1)*'*') result = ' '.join(listB) print(result) # 위의 식을 정규 표현식으로 작성한다면?
-
메타문자
-
메타문자란 원래 그 문자의 뜻이 아니라 특별한 용도로 사용되는 문자를 의미한다
[ ] \ . * + { } ? ^ $ | ( )
1) [ ] : character class
- [ ] 사이의 문자들과 매치
- [abc] : [와 ] 사이의 문자인 abc 중 한 개의 문자와의 매치
- apple -> a,b,c 중 a 문자를 가지고 있어서 매치
- hello -> a,b,c 중 어떤 문자도 가지고 있지 않아서 매치되지 않음
- [
-
] : 두 문자 사이의 범위를 의미- [a-d] : a, b, c, d 를 의미한다 [abcd] 와 동일한 의미
- [1-5] : 1부터 5까지 [12345]와 동일한 의미
- [a-zA-Z] : 알파벳 전체
- [0-9] : 숫자
- [^] : 반대(not)의 의미를 가짐
- [0-9] 는 숫자를 의미하는데,
[^0-9]
는 숫자가 아닌 문자를 의미
- [0-9] 는 숫자를 의미하는데,
-
그외 자주 사용하는 문자 클래스
\d : 숫자와의 매치 [0-9]와 동일 <-> \D : 숫자가 아닌 것과 매치 [^0-9] \s : 공백 whitespace와 매치 <-> \S : 공백문자 외의 것과 매치 \w : 문자+숫자와의 매치 <-> \W : 문자+숫자가 아닌 문자와 매치 [a-zA-Z0-9_]와 동일 [^a-zA-Z0-9_]와 동일
2) DOT(.)
- 줄바꿈 문자인
\n
을 제외한 모든 문자와 매치된다는 의미- re.DOTALL 옵션을 주면
\n
도 매치 가능
- re.DOTALL 옵션을 주면
- 찍은 dot(.) 개수 만큼의 모든 문자와 매치된다
- a.b
- ‘a’ + 모든 문자 + ‘b’
- aab : a + a + b 로, 모든 문자 자리에 a 가 들어갔으므로 매치
- a0b : a + 0 + b 로, 모든 문자 자리에 0이 들어갔으므로 매치
- ab : a+ + b 로, 모든 문자 자리에 아무것도 없기 때문에 매치되지 않음
- 단, 문자클래스 사이에 Dot(.) 있으면 모든 문자라는 의미가 아니라
.
그 자체를 의미- a[.]b
- a.b : . 그자체를 의미하기 때문에 매치
- aeb : . 이 아니라 e가 있기 때문에 매치되지 않음
3) * : 0번 이상 반복
*
바로 앞에 있는 문자 한 개가 0번 이상 ~ 무한대 반복될 수 있음을 의미- 물론 메모리 제한으로 무한대번이 아니라 약 2억개 정도만 가능하다고 함
- to*m
- tm : o 가 0번 이상 반복하므로 매치
- toooom : o가 0번 이상 반복하므로(4번) 매치
4) + : 1번 이상 반복
*
바로 앞에 있는 문자 한 개가 1번 이상 ~ 무한대 반복될 수 있음을 의미- to*m
- tm : o가 1번 이상 반복하지 않아서 매치되지 않음
- tom : o가 1번 이상 반복하므로 매치
5) {m}, {m, }, {m,n} 반복 횟수 정하기
- {m} : m번 반복 / {m, n} : m~n 번 사이 반복
- 즉,
*
는 {0, } 이고, + 는 {1, } 과 같은 의미 - 하지만 {} 반복 횟수를 정하기 보다 정확한 메타문자를 쓰는 것이 이해하기에 좋다
- 즉,
- to{2}
- too : o가 2번 반복하므로 매치
- to : o가 2번 반복하지 않았으므로 매치되지 않음 (1번 반복)
- to{2,4}
- too : o 가 2번 ~ 4번 사이로 반복해서 매치 (2번)
- tooo : o 가 2번 ~ 4번 사이로 반복해서 매치 (3번)
6) ? : 있어도 되고, 없어도 되고 {0, 1}
?
바로 앞에 있는 문자가 0번이상 ~ 1번 반복될 수 있음 –> 있어도 되고, 없어도 된다는 의미
Comments