코딩테스트에 등장해서 한 번 정리하려고 글을 써본다.
정규표현식은 정말 유용하며 코딩테스트의 문자열 처리 시 엄청나게 큰 도움을 줄 것이 분명하다.
전체를 아우르며 코딩테스트에 나오는 부분은 강조해서 정리해보겠다
깔고가는 기본 지식
메타 문자, meta characters
. ^ $ * + ? { } [ ] \ | ( )
** 문자열에 메타문자가 있을 시에는 특수 문자를 판단할 때는 특수 문자 앞에 \를 붙이면 된다.
1. 문자 클래스 [ ] -> "[ ] 사이의 문자들과 매치"를 의미
다시 말해서 [특정문자열들+조건], 특정문자열보다 범위를 판단할 때 많이 쓰임
**어떤 문자나 메타 문자도 사용할수 있지만 주의해야 할 메타 문자가 1가지 있다.
문자 클래스 안에 ^ 메타 문자를 사용할 경우
반대(not)라는 의미를 갖는다. 예를 들어 [^0-9]라는 정규 표현식은 숫자가 아닌 문자만 매치된다.
**외워두면 좋은.. 문자클래스 표현
-
\d - 숫자와 매치, [0-9]와 동일한 표현식이다.
-
\D - 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.
-
\s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.
-
\S - whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.
-
\w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다.
-
\W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다.
2. 하이픈(-)은 두 문자 사이의 범위(From - To)를 의미
-
[a-zA-Z] : 알파벳 모두
-
[0-9] : 숫자
3. Dot(.) 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.
a.b -> "a + 모든문자 + b"
a[.]b -> "a + Dot(.)문자 + b"
4. 반복 (*), 반복 (+), 반복 ({m,n}) or {m} or ?
ca*t -> c+a가 0개 이상 + t
ca+t -> c + a가 1개 이상 + t
ca{2}t -> c + a 2번만 반복 + t
ca{2,5}t -> c + a가 2에서 5회만 반복 + t
ab?c -> a + b 가 없거나 1개 있거나 + c
5. | 는 or과 동일한 의미로 사용된다. A|B라는 정규식이 있다면 A 또는 B라는 의미
6. ^ 메타 문자는 문자열의 맨 처음과 일치함을 의미한다.
7. $는 문자열의 끝과 매치함을 의미한다.
관련 메서드
**가장 많이 쓰일 문자열 바꾸기
정규식과 매치되는 부분을 바꾸는 메서드이다.
sub 메서드!!!
>>> p = re.compile('(blue|white|red)')
>>> p.sub('colour', 'blue socks and red shoes')
'colour socks and colour shoes' # 결과
**같은 정규표현식을 쓴다면 팁
객체 = re.compile('패턴') 으로 저장하여 다른 메서드에 적용가능하다.
예를 들어서
객체.match('문자열'),객체.search('문자열')
>>> p = re.compile('[0-9]+') # 정규표현식 패턴을 객체로 만듦
>>> p.match('1234') # 정규표현식 패턴 객체에서 match 메서드 사용
<_sre.SRE_Match object; span=(0, 4), match='1234'>
>>> p.search('hello') # 정규표현식 패턴 객체에서 search 메서드 사용
이것이 정말 잘 쓰인다.
-
문자열에 특정 문자열이 포함되어 있는지 판단
>>> import re
>>> re.match('Hello', 'Hello, world!') # 문자열이 있으므로 정규표현식 매치 객체가 반환됨
<_sre.SRE_Match object; span=(0, 5), match='Hello'>
>>> re.match('Python', 'Hello, world!') # 문자열이 없으므로 아무것도 반환되지 않음
일반적으로 위와같이
re.match( 특정 문자열, 특정문자열을 찾을 문자열)
이렇게 이해하기 쉽게 써보았다.
-
문자열이 맨 앞에 오는지 맨 뒤에 오는지 판단하기
맨 앞, 맨 뒤라는 조건을 어떻게 정규표현식으로 나타내느냐?
^문자열, 문자열$로 나타낼 수 있다.
^는 앞
$는 뒤
>>> re.search('^Hello', 'Hello, world!') # Hello로 시작하므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 5), match='Hello'>
>>> re.search('world!$', 'Hello, world!') # world!로 끝나므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(7, 13), match='world!'>
다시 말하자면
re.search(^특정문자열, 특정문자열을 찾을 문자열) -> ^이 있으니 특정문자열로 시작하는지 확인해본다
re.search(특정문자열$, 특정문자열을 찾을 문자열) -> $이 있으니 특정문자열로 끝나는지 확인해본다
-
지정된 문자열이 하나라도 포함되는지 판단하기
문자열|문자열|문자열|문자열 -> 이와 같이 표현
>>> re.match('hello|world', 'hello') # hello 또는 world가 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 5), match='hello'>
re.match(특정문자열| 특정문자열... , 특정문자열을 찾을 문자열) -> 특정문자열들이 포함되어있나 확인한다.
이것도 진짜 잘 쓰인다. 어쩌면 이게 더..?
-
범위 포함되는지 판단하기 or 범위에 포함되지 않는지 ******
[ ]안에 범위를 넣으며 * 또는 +를 붙인다.(안붙여도 되고)
예를 들어서
'[^a-z0-9\-_.]' -> 문자 클래스 안의 ^는 not이라고 했다.
대괄호 안의 것들이 아닌 것들이 매치되는 것이다.
**^가 []안에 있다면 포함되지 않는 것들과 매치 없다면 포함되는 것들과 매치된다.
-
문자개수 판단하기
?는 ? 앞의 문자(범위)가 0개 또는 1개인지 판단하고, .은 .이 있는 위치에 아무 문자(숫자)가 1개 있는지 판단한다.
예를 들어
re.match('abc?d', 'abd') # abd에서 c 위치에 c가 0개 있으므로 패턴에 매칭됨
문자열을 괄호로 묶고 뒤에 {개수} 형식으로도 가능하다.
예를 들어
h{3}은 h가 3개 있는지 판단하고, (hello){3}은 hello가 3개 있는지 판단한다.
>>> re.match('h{3}', 'hhhello') <_sre.SRE_Match object; span=(0, 3), match='hhh'>
-
공백 처리하기
공백은 ' '처럼 공백 문자를 넣어도 되고, \s 또는 \S로 표현할 수도 있다.
>>> re.match('[a-zA-Z0-9 ]+', 'Hello 1234') # ' '로 공백 표현
<_sre.SRE_Match object; span=(0, 10), match='Hello 1234'>
>>> re.match('[a-zA-Z0-9\s]+', 'Hello 1234') # \s로 공백 표현
<_sre.SRE_Match object; span=(0, 10), match='Hello 1234'>
참고 링크
'프로그래밍 지식 > Python' 카테고리의 다른 글
람다 표현식,lambda expression [파이썬] (0) | 2021.03.11 |
---|---|
파이썬과 아나콘다 그리고 주피터노트북 Python & Anaconda, Jupyter Notebook; Window, 윈도우 (0) | 2021.01.05 |
[Python] permutations() 라이브러리 이용하기 (0) | 2020.07.29 |
[Python] Counter 라이브러리 이용하기 (0) | 2020.07.29 |
[Python]TypeError: expected string or bytes-like object(정규표현식 에러) (0) | 2020.07.27 |