본문 바로가기
AI 공부/파이썬

파이썬 (정규 표현식, 메타문자)

by AI Sonny 2022. 8. 9.
728x90

정규식

  • 정규표현식은 복잡한 문자열을 처리할 때 사용하는 기법
  • 파이썬만의 고유한 기법이 아니라 문자열을 처리하는 모든 곳에서 사용

 

규칙 찾기

 

data = "나의 전화번호는 010-0000-0000 입니다. 너의 전화번호는 010-1111-1111 입니다."

 

텍스트의 규칙을 보니 띄어쓰기 기준으로 나누고, 전화번호의 특징을 보면 하이픈이 사이에 2개가 있다.

 

전화번호의 특징이 첫 3자리, 두번째 4자리, 세번째 4자리 형식이다.

 

data = "나의 전화번호는 010-0000-0000 입니다. 너의 전화번호는 010-1111-1111 입니다."
import re
pat = re.compile("\d{3}-\d{4}-\d{4}")
phone_list = pat.findall(data)
phone_list

=> ['010-0000-0000', '010-1111-1111']

 


re(regular expression) 모듈

  • 파이썬의 정규표현식을 지원하기 위한 모듈

 

- match 함수

  • pattern에 맞는 문자열로 시작하는지 검사하고 매칭이 되면 match 객체를 반환하고, 그렇지 않으면 None 을 반환한다.

예시

 

data = "나의 전화번호는 010-0000-0000 입니다. 너의 전화번호는 010-1111-1111 입니다."
print(re.match("나의",data))
print(re.match("전화",data))

=>	<re.Match object; span=(0, 2), match='나의'>
	None

 

- search 함수

  • pattern에 맞는 문자열을 검사하고 매칭되면 바로 match 객체를 반환한다.
  • 매칭이 안되면 None을 반환한다.

예시

 

data = "나의 전화번호는 010-0000-0000 입니다. 너의 전화번호는 010-1111-1111 입니다."
re.search("전화",data)

=> <re.Match object; span=(3, 5), match='전화'>

 

- findall 함수

  • 정규식과 매칭되는 모든 문자열을 리스트로 반환한다.

예시

 

data = "나의 전화번호는 010-0000-0000 입니다. 너의 전화번호는 010-1111-1111 입니다."
re.findall("번호",data)

=> ['번호', '번호']

 

 

- sub 함수

  • 정규식과 매칭되는 부분을 치환해준다.

예시

 

re.sub("전화번호","핸드폰번호",data)

=> 나의 핸드폰번호는 010-0000-0000 입니다. 너의 핸드폰번호는 010-1111-1111 입니다.

 


 

메타문자

  • 메타문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자
  • 대괄호 안에서는 메타문자열학을 안한다. ( \ 사용해야한다)
  • \ ^ $ . [] () * + ? {}

 

- '.'

  • 줄바꿈 문자(\n)를 제외한 모든 문자와 매치

 

예시

 

data = "abc a\nc a c"
re.findall("a.c",data)

=> ['abc', 'a c']

 

 

- '*'

  • 바로 앞에 문자가 0번 이상 반복할 경우 매치

 

예시

 

data = "abc ac abbc a c"    
re.findall("ab*c",data) # 왼쪽에는 a가 있고 b가 와야한다. 그리고 오른쪽에는 b 다음에 c가 있는 것

=> ['abc', 'ac', 'abbc']

 

- '+'

  • 바로 앞에 문자가 1번 이상 반복할 경우 매치

 

예시

 

data = "abc ac abbbc"
re.findall("ab+c",data)

=> ['abc', 'abbbc']

 

반복 횟수 제한

  • {m,n}: 바로 앞에 문자의 반복 횟수가 m번에서 n번 사이
  • {m}: 바로 앞에 문자의 반복 횟수가 m번
  • {m,}: 바로 앞에 문자의 반복 횟수가 m번 이상
  • {,n}: 바로 앞에 문자의 반복 횟수가 n번 이하

 

예시

 

data = "abc ac abbbc abbbbc"
re.findall("ab{1,3}c",data)

=> ['abc', 'abbbc']

------------------------------

data = "abc ac abbbc abbbbc"
re.findall("ab{4}c",data)

=> ['abbbbc']

 

- '?'

  • 반복은 아니지만 앞에 문자가 있거나 없거나를 의미

 

예시

 

data = "abc ac abbbc abbbbc"
re.findall("ab?c",data) # ab{0,1}

=> ['abc', 'ac']

 

 

- '[ ]'

  • [ ] 사이의 문자들과 매칭이라는 의미

 

예시

 

data = "abc ac acc acb"
re.findall("a[bc]c",data) # b or c

=>	['abc', 'acc']

 

 

하이픈(-) 사용하기

  • [a-zA-Z] : 모든 알파벳과 매치
  • [0-9] : 모든 숫자와 매치

 

예시

 

data = "python 3.10.5"
re.findall("[0-9a-zA-Z]+",data)  # 모든 문자 출력(if '.'출력하고 싶으면 '.'넣기!)

=> ['python', '3', '10', '5']

 

  • \d : `[0-9] 과 동일
  • \w : `[a-zA-Z0-9_] 과 동일

 

예시

 

data = "python 3_10_5"
re.findall("\w+",data)

=> ['python', '3_10_5']

 

- [^]

  • not을 의미한다.

 

예시

 

data = "python 3.10.5"
re.findall("[^\d. ]+",data)

=> ['python']

 

  • ^ : 검사하고자하는 문자열에 정규식에 맞는 문자로 시작하는지를 검사한다.
  • $ : 검사하고자하는 문자열에 정규식에 맞는 문자로 끝나는지를 검사한다.

 

예시

 

phone = "p010-0000-0000qwe" # 잘못된 정보를 확인하기 위해 주로 쓰인다.
match = re.search("^\d{3}-\d{4}-\d{4}$",phone)
match

=> <re.Match object; span=(0, 13), match='010-0000-0000'>

 


 

- 프로그램 내에서 자주 사용하는 정규식 패턴에 경우 re.compile 함수를 이용해 컴파일을 미리한 후

 

패턴객체를 생성해서 찾자. 즉, 자주쓰는 패턴이라면 정규식을 미리 컴파일하자.

 

예시

 

pat_obj = re.compile("\d{3}-\d{4}-\d{4}")
type(pat_obj)
pat_obj.findall(data)

=> ['010-0000-0000', '010-1111-1111']

 


 

이번 정규표현식은 뭔가 완벽하게 끝내지 못한 느낌인 것 같다.

 

그래서 연습이 더 필요할 것 같다.

 

강사님이 추천해주신 사이트에서 연습해봐야겠다.

 

사이트 주소는 https://regex101.com/ 이다...!

728x90

댓글