Scribbling

<Python> 정규표현식 본문

Computer Science/Python

<Python> 정규표현식

focalpoint 2021. 11. 9. 22:54

정규 표현식 혹은 정규식은 문자열 매칭에 매우 유용하다.

정규 표현식에 대해 자세히 알고 싶다면 아래 링크를 참고하라.

https://wikidocs.net/1642

 

07-1 정규 표현식 살펴보기

정규 표현식(Regular Expressions)은 복잡한 문자열을 처리할 때 사용하는 기법으로, 파이썬만의 고유 문법이 아니라 문자열을 처리하는 모든 곳에서 사용한다. 정 ...

wikidocs.net

https://dojang.io/mod/page/view.php?id=2435 

 

파이썬 코딩 도장: 43.1 문자열 판단하기

Unit 43. 정규표현식 사용하기 정규표현식(regular expression)은 일정한 규칙(패턴)을 가진 문자열을 표현하는 방법입니다. 복잡한 문자열 속에서 특정한 규칙으로 된 문자열을 검색한 뒤 추출하거나

dojang.io

이 글에서는 최대한 간략하게 다루었다.

 

파이썬은 정규 표현식을 지원하기 위한 기본 라이브러리가 있다. (re)

re는 regular expression의 약어이며, 이 라이브러리에 대해 살펴보자.

p = re.compile('패턴 혹은 정규식') 형식으로 컴파일된 패턴 객체를 생성할 수 있다.

컴파일된 패턴 객체(p)는 아래 4가지 메서드를 제공한다.

- match(): 문자열의 처음부터 정규식과 매치되는지 확인 (매치 시 match 객체 return, 그 외 None)

- search(): 문자열 전체를 검색하여 정규식과 매치되는지 확인

- findall(): 정규식과 매치되는 모든 문자열을 리스트로 return

- finditer(): 정규식과 매치되는 모든 문자열을 반복 가능한 객체로 return

import re

p = re.compile('[a-z0-9]+')

m1 = p.match('hello')
m2 = p.match('H')
print(m1)
print(m2)

import re

p = re.compile('[a-z0-9]+')

m1 = p.findall('what the hell')
m2 = p.findall('WHAT THE FUCK')

print(m1)
print(m2)

Match 객체는 다음 네개의 메서드를 지원한다.

- group(): 매치된 문자열을 return

- start(): 매치된 문자열의 시작 위치를 return

- end(): 매치된 문자열의 끝 위치를 return

- span(): 매치된 문자열의 (시작, 끝) tuple을 return

import re

p = re.compile('[a-z0-9]+')

m1 = p.search('what the hell')

print(m1.group())
print(m1.span())

 

지금까지 re 라이브러리를 사용하는 방법을 다루었다.

여기서부터는 정규식 규칙을 다룬다.

 

1. 문자열이 맨 앞 혹은 맨 뒤에 매치되는지 확인

^문자열: 맨 앞

문자열$: 맨 뒤

p = re.compile('^[a-z0-9]+')

 

2. 지정된 정규식 중 하나라도 매치되는지 확인 (Or)

문자열|문자열

m = re.search('[a-z]+|[0-9]+', '11254')

 

3. 범위, *, +, ?, .

범위를 표현하기 위해 [ ] 를 사용한다.

*: 특정 문자(열)이 0개 이상 있는지 확인

+: 특정 문자(열)이 1개 이상 있는지 확인

?: 특정 문자(열)이 0개 혹은 1개인지 확인

.: 아무 문자(숫자) 1개가 있는지 확인

m = re.search('[0-9].[a-z]+', '3face')

 

4. 문자(열) 개수 확인

문자(열)의 개수 확인에는 { }를 사용한다.

{3}은 3개 있는지 확인, {7, 8}은 7~8개 있는지 확인

m = re.search('(gofish){3}', 'gofishgofishgofishgofishgofish')

 

5. 특정 범위 제외하기

[^범위]: 해당 범위를 제외한 문자

m = re.search('[^0-9]+', 'ㅇㅇㅇ')

 

6. 특수 문자 매칭

정규식에 사용되는 특수 문자 * + ? . ^ $ ( ) [ ] - 는 앞에 \를 붙여서 구별한다.

단, [ ] 안의 특수 문자는 \를 붙이지 않아도 된다.

m = re.search('\([*]*\)', '(*********)')

 

7. 범위 간단히 표현하기

- \d: [0-9]

- \D: [^0-9]

- \w: [a-zA-Z0-9_]

- \W: [^a-zA-Z0-9_]

- \s: [ \t\n\r\f\v]

- \S: [^ \t\n\r\f\v]

 

8. 그룹

패턴 안에서 정규 표현식을 ( )로 묶으면 그룹이 된다.

매칭객체.group(그룹숫자)은 매칭된 문자열을 반환한다.

m = re.match('([0-9]{3}) ([a-z]*)', '345 bbcd')
print(m.group())
print(m.group(1))

그룹 개수가 많아지면 숫자로 그룹 구분이 어렵다. 이럴 땐 그룹에 이름을 부여할 수 있다.

(?P<이름>정규표현식)

m = re.match('(?P<func>[a-zA-Z_][a-zA-Z0-9_]+)\((?P<arg>\w+)\)', 'print(3337)')
print(m.group('func'))
print(m.group('arg'))

 

9. 문자열 교체

re.sub 함수로 문자열 교체가 가능하다.

re.sub('패턴', '바꿀문자열' or 교체 함수, '문자열', 바꿀횟수)

print(re.sub('[0-9]+', 'n', '1 2 apple 4 be ezz 7 8'))
print(re.sub('[0-9]+', lambda m: str(int(m.group()) * 10), '1 2 dda 4 beez aab 7 8'))

그룹을 이용하면 정규표현식으로 찾은 문자열을 다시 사용가능하다.

print(re.sub('([a-z]+) ([0-9]+)', '\\2 \\1 \\2 \\1', 'hello 1234'))
print(re.sub('({\s*)"(?P<key>\w+)":\s*"(?P<value>\w+)"(\s*})', '<\\g<key>>\\g<value></\\g<key>>', '{ "name": "james" }'))

'Computer Science > Python' 카테고리의 다른 글

Python String Methods  (0) 2022.01.18
Python Int Representation & Bit Operations  (0) 2022.01.13
<Python> Decorator  (0) 2021.11.09
<Python> Iterator, Generator  (0) 2021.11.09
<Python> Class 파헤치기  (0) 2021.10.28