꽃무늬 키보드

정규식_메타문자와 문자열 매칭 본문

Programming/python

정규식_메타문자와 문자열 매칭

Katherine Choi 2014. 6. 16. 14:11

정규식?


정규식은 복잡한 문자열 패턴을 조사하고 규칙을 정의하는 문자열이다. 

python에서 정규식은 re모듈로 제공된다.




메타 문자


1. 반복 메타 문자


정규식은 문자나 문자 패턴의 반복을 나타내기 위한 메타 문자가 존재한다. 지정된 횟수만큼 

의 문자나 패턴의 반복을 허용한다.

 

 반복 메타 문자

 의미

 예시 

 *

 0회 이상 반복

 ab*c는 ac, abc, abbc, abbbbbc 등과 매치

 +

 1회 이상 반복 

 ab+c는 abc, abbbbc 등과 매치

 ?

 0회 혹은 1회 

 ab?c는 ac, abc와 매치

 {m}

 m회 반복 

 ab{2}는 abb와 매치

 {m,n}

 m회부터 n회까지 반복

 ab{2,4}는 abb




2. 매칭 메타 문자


정규식을 표현하기 위한 매칭 메타 문자는 다음과 같다.


 매칭 메타 문자

 의미

 .

 줄바꿈 문자를 제외한 모든 문자와 매치

 re.DOTALL 모드 사용시 줄바꿈 문자도 매치 

 ^

 문자열의 시작과 매치

 re.MULTILINE 모드 사용 시 각 라인의 시작과 매치 

 [] 메타 기호 안에서는 반대의 문자열과 매치. 즉 [^2]는 2가 아닌 문자

 $

 문자열의 마지막과 매치

 [] 메타 기호 안에서는 순수한 $문자로 매치 

 []

 문자 집합을 나타낸다.

 [abc]는 'a', 'b','c'중 한 문자이며 [a-c]와 같이 범위를 타나내 사용할    수 있다. 

 [a-zA-Z0-9]는 영문자 숫자를 의미

 |

 a|b는 a 또는 b 의 의미다 

 ()

 정규식을 그룹으로 묶는다





매칭


1. 문자열 매치


re.match 함수는 문자열이 매치된 경우 Match 객체를 리턴하고 매치되지 않을 경우 리턴 

값이 없다. 실제로는 None 객체를 리턴하게 된다.


 >>> re.match('[0-9]', '12345')

<_sre.SRE_Match object at 0x02A17BB8>



2. 매치된 문자열 추출


re.group() 함수를 이용해 매치된 문자열을 추출한다.


 >>> m = re.match('[0-9]','12345')

 >>> m.group()

 '1'


  •  위에서는 숫자 한 개만 추출되었다. 한 개 이상의 숫자를 매칭하기 위해서 '+' 기호  를  사용한다.

 >>> m = re.match('[0-9]+','12345abc')

 >>> m.group()

 '12345'


  •  '+'기호는 공백이 온 경우에도 매칭된다.

 >>> m = re.match('[0-9]+','12345     ')

 >>> m.group()

'12345'


  •  그렇다면 공백을 포함하여 매칭할 수도 있다. \s는 공백(\t \n \r \f \v) 등의 공백문자를 나타낸다. 이스케이프 기호라고 한다.

 >>> m = re.match('\s*[0-9]+','     12345')
 >>> m.group()
 '     12345'



* 이스케이프 기호


분야

 설명 

 \\ 

 역슬래쉬 문자 자체를 의미 

 \d 

 모든 숫자와 매치 [0-9] 

 \D 

 숫자가 아닌 문자와 매치 [^0-9] 

 \s 

 화이트 스페이스 문자와 매치 [\t\n\r\f\v] 

 \S 

 화이트 스페이스 문자가 아닌 것과 매치 [^\t\n\r\f\v]

 \w

 숫자 또는 문자와 매치 [a-zA-Z0-9] 

 \W

 숫자 또는 문자가 아닌 것과 매치 [^a-zA-Z0-9]  

 \b

 단어의 경계를 나타냄.  단어는 영문자 혹은 숫자의 연속 문자열로 가정 

 \B

 \b의 반대로 단어의 경계가 아님을 나타냄. 




3. match와 search 의 차이

  • match : re.match 함수는 문자열의 시작부터 일치하는지 검사한다.
  • search : re.search 함수는 부분적으  로 매치되는 문자열이 있는지 검사한다.



4. 로(raw) 모드  정규식 표현


이스케이프 문자열을 표현하기 위해  '\'(백슬래쉬)문자를 사용하므로, 문자 '\'를 정규표현식

으로 표현하기 위해 '\\\\'로 표현을 해야한다.

이때 로우 문잦열 표기법을 사용할 수 있다. 이는 문자열 앞에 'r'을 더한 것으로 '\'(백슬래쉬) 

문자를 이스케이프 문자열로 처리하지 않고 일반 문자와 동일하게 처리한다.


 >>> re.search('\\\\\w+','\\apples').group()

 '\\apples'

 >>> re.search(r'\\\w+', r'\apples').group()

 '\\apples'




* re 모듈의 주요 메소드


 메소드

 설명 

 compile(pattern[, flags])

 패턴을 컴파일하여 정규식 객체를 반환 

 match(pattern, string[, flags])

 string의 시작부분부터 패터이 존재하느니 검사  하여 MatchObject 인스턴스 반환

 search(pattern, string[, flags])

 string의 전체에 대해 패턴이 존재하는지 검사  하여 MatchObject 인스턴스 반환

 split(pattern, string[, flags]) 

 패턴을 구분자로 string을 분리하여 리스트로  반환

 findall(pattern, string[, flags])

 string에서 패턴을 만족하는 문자열을 리스트로  반환 

 finditer(pattern, string[, flags])

 string에서 패턴을 만족하는 문자열을 반복자로  반환

 sub(pattern, repl, stringp[, count=0]) 

 string에서 패턴과 일치하는 부분에 대하여  repl로  교체하여 결과 문자열을 반환 

 subn(pattern, repl, string[, count=0])

 sub와 동일하나, 결과(결과 문자열, 매칭횟수)  를 튜플로 반환 

 escape(string)

 영문자 숫자가 아닌 문자들을 백슬래쉬 처리해  서 리턴 (임의의 문자열을 정규식 패턴으로    사용할 경우 유용) 




Comments