정규표현식
정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어 입니다.
특히 문자열을 처리할 때 정규표현식을 쉽게 활용할 수 있습니다.
정규표현식은 모든 프로그래밍 언어의 공통으로 사용할 수 있기 때문에 한번 익혀놓으면
어디든지 활용하기 용이합니다.
정규표현식에 알아보고 파이썬에서 활용하는 방법을 확인해보겠습니다.
파이썬에서는 정규표현식 모듈 re를 지원합니다.
이를 이용하여 특정 규칙이 있는 텍스트 데이터를 빠르게 정제할 수 있겠죠?
복잡해 보이지만 한번 익혀놓으면 편합니다.
실습을 통해 하나씩 알아보겠습니다.
. 기호
. 은 __한 개의 임의의 문자__를 나타냅니다.
예를 들어서 정규 표현식이 a.c라고 합시다. a와 c 사이에는 어떤 1개의 문자라도 올 수 있습니다. 즉, akc, azc, avc, a5c, a! c와 같은 형태는 모두 a.c의 정규 표현식과 매치됩니다.
우선 import re로 모듈을 추가해주고
re.compile('a.c')을 통해 표현식을 미리 컴파일해서 패턴을 저장하는 경우와
re.findall('a.c', '찾을 문자')처럼 인수로 바로 적용하는 경우가 있는데, 컴파일하는 경우 패턴 객체를 재사용할 수 있기
때문에 상황에 맞춰 사용하시면 될 것 같습니다.
import re
r=re.compile("a.c") # a와 c 사이에는 어떤 1개의 문자라도 올 수 있습니다.
# 즉, akc, azc, avc, a5c, a!c와 같은 형태는 모두 a.c의 정규 표현식과 매치
r.search("kkk") # 아무런 결과도 출력되지 않는다.
out = r.search('abc')
print(out)
print(out.string)
? 기호
? 앞의 문자가 존재할 수도 있고, 존재하지 않을 수도 있는 경우를 나타냅니다.
예를 들어서 정규 표현식이 ab? c라고 합시다. 이 경우 이 정규 표현식에서의 b는 있다고 취급할 수도 있고, 없다고 취급할 수도 있습니다. 즉, abc와 ac 모두 매치할 수 있습니다.
import re
r = re.compile('ab?c') # ?는 한개있거나 없거나
r.search('abbc') # 아무런 결과도 출력되지 않음
print(r.search('abc'))
print(r.search('ac'))
* 기호
바로 앞의 문자가 0개 이상일 경우를 나타냅니다. 앞의 문자는 존재하지 않을 수도 있으며, 또는 여러 개일 수도 있습니다. 예를 들어서 정규 표현식이 ab*c라고 합시다. 그렇다면 ac, abc, abbc, abbbc 등과 매치할 수 있으며 b의 개수는 무수히 많아도 상관없습니다.
import re
r = re.compile('ab*c')
r.search('a') # 아무런 결과도 출력되지 않음
print(r.search('ac'))
print(r.search('abc'))
print(r.search('abbbbc'))
+ 기호
+는 *와 유사합니다. 하지만 다른 점은 __앞의 문자가 최소 1개 이상__이어야 한다는 점입니다. 예를 들어서 정규 표현식이 ab+c라고 한다면, ac는 매치되지 않습니다. 하지만 abc, abbc, abbbc 등과 매치할 수 있으며 b의 갯수는 무수히 많을 수 있습니다.
import re
r = re.compile('ab+c')
r.search('ac') # 아무런 결과도 출력 X
print(r.search('abc'))
print(r.search('abbbbc'))
^ 기호
^는 __시작되는 글자를 지정__합니다. 가령 정규표현식이 ^a라면 a로 시작되는 문자열만을 찾아냅니다.
import re
r = re.compile('^a')
r.search('bbc') # 아무런 결과도 출력 X
print(r.search('ab'))
print(r.search('abb'))
_{숫자} 기호
문자에 해당 기호를 붙이면, 해당 문자를 숫자만큼 반복한 것을 나타냅니다.
예를 들어서 정규 표현식이 ab {2} c라면 a와 c 사이에 b가 존재하면서 b가 2개인 문자열에 대해서 매치합니다.
import re
r=re.compile("ab{2}c")
r.search("ac") # 아무런 결과도 출력되지 않는다.
r.search("abc") # 아무런 결과도 출력되지 않는다.
r.search('abbc')
_{숫자1, 숫자2} 기호
문자에 해당 기호를 붙이면, __해당 문자를 숫자1 이상 숫자2 이하만큼 반복__합니다. 예를 들어서 정규 표현식이 ab {2,8} c라면 a와 c 사이에 b가 존재하면서 b는 2개 이상 8개 이하인 문자열에 대해서 매치합니다.
import re
r=re.compile("ab{2,8}c")
r.search("ac") # 아무런 결과도 출력되지 않는다.
r.search("abc") # 아무런 결과도 출력되지 않는다.
print(r.search("abbc"))
print(r.search("abbbbbbbbc")) # b가 8개이하 인정
print(r.search('abbbbbbbbbc'))
_{숫자,} 기호
문자에 해당 기호를 붙이면 __해당 문자를 숫자 이상만큼 반복__합니다. 예를 들어서 정규 표현식이 a {2,} bc라면 뒤에 bc가 붙으면서 a의 개수가 2개 이상인 경우인 문자열과 매치합니다. 또한 만약 {0,}을 쓴다면 *와 동일한 의미가 되며, {1,}을 쓴다면 +와 동일한 의미가 됩니다.
import re
r=re.compile("a{2,}bc")
r.search("bc") # 아무런 결과도 출력되지 않는다.
r.search("aa") # 아무런 결과도 출력되지 않는다.
print(r.search("aabc"))
print(r.search("aaaaaaaabc"))
[] 기호
[ ] 안에 문자들을 넣으면 __그 문자들 중 한 개의 문자와 매치라는 의미__를 가집니다. 예를 들어서 정규 표현식이 [abc]라면, a 또는 b 또는 c가 들어가 있는 문자열과 매치됩니다. 범위를 지정하는 것도 가능합니다. [a-zA-Z]는 알파벳 전부를 의미하며, [0-9]는 숫자 전부를 의미합니다.
import re
r=re.compile("[abc]") # [abc]는 [a-c]와 같다.
r.search("zzz")
r.search("a")
r.search("aaaaaaa")
r.search("baac")
import re
r=re.compile("[a-z]")
r.search("AAA") # 아무런 결과도 출력되지 않는다.
r.search("aBC")
r.search("111") # 아무런 결과도 출력되지 않는다.
[^문자] 기호
[^문자]는 앞에서 ^와는 완전히 다른 의미로 쓰입니다. 여기서는 ^ 기호 뒤에 붙은 문자들을 제외한 모든 문자를 매치하는 역할을 합니다. 예를 들어서 [^abc]라는 정규 표현식이 있다면, a 또는 b 또는 c가 들어간 문자열을 제외한 모든 문자열을 매치합니다.
import re
r=re.compile("[^abc]")
r.search("a") # 아무런 결과도 출력되지 않는다.
r.search("ab") # 아무런 결과도 출력되지 않는다.
r.search("b") # 아무런 결과도 출력되지 않는다.
r.search("desk")
r.findall('desk')
r.search("12345")
정규 표현식에 사용하는 기호를 실습을 통해 알아보았는데요. 한번 익히면 엄청 편할 것 같지 않나요?
https://regexr.com/5mhou 여기 사이트는 / / 사이에 정규표현식을 넣으면 밑에 문자열에 적용되는 게 보여서
연습하기 편하실 것 같아 공유해봅니다.
글이 길어져서 글을 2개로 나누어야 할 것 같네요. 다음 글에서는 re 모듈 함수에 대해 알아보겠습니다.
2번째 글도 꼭 읽어주시면 감사하겠습니다.
'AI & Python' 카테고리의 다른 글
파이썬(python) 설치 및 파이참(pycharm) 설치 with 윈도우10 (1) | 2021.10.07 |
---|---|
정규표현식(Regular Expression) with 파이썬 . ? + *기호 re.compile(), re.findall(), re.sub() (2) (0) | 2021.09.14 |
자연어처리, 워드임베딩 (Word2Vec, FastText , GloVe 예제)(2) (0) | 2021.09.09 |
자연어처리, 워드임베딩 (Word2Vec, FastText , GloVe 예제)(1) (0) | 2021.09.09 |
딥러닝에서 가중치(W), 편향(Bias)의 역할 (3) | 2021.08.30 |