프로그래밍 지식/Python

Regular expression,정규표현식, 문자열파싱,처리 [Python]

게임이 더 좋아 2021. 3. 6. 05:03
반응형
728x170

 

코딩테스트에 등장해서 한 번 정리하려고 글을 써본다.

 

정규표현식은 정말 유용하며 코딩테스트의 문자열 처리 시 엄청나게 큰 도움을 줄 것이 분명하다.

전체를 아우르며 코딩테스트에 나오는 부분은 강조해서 정리해보겠다

 

 


깔고가는 기본 지식

 

메타 문자, 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'>

 

 


 참고 링크

docs.python.org/3/library/re.html

wikidocs.net/book/1

728x90
반응형
그리드형