backend/python

정규표현식-Regular expression

seul chan 2016. 11. 17. 00:57

정규표현식


*정규표현식- 메타 문자


1. 숫자, 문자 


2.1 "." 쓰는법(DOT)

-메타문자 .  : 거의 모든 문자열과 일치

-줄바꿈 문자인 \n를 제외한 모든 무자와 매치

- . 만 단독으로 쓸 경우에는 \. 로 사용 (역슬래쉬)

ex) a.b : "a + 모든 문자 + b", 즉 a, b 사이에 모든 문자가 들어가도 매치,

*문자클래스[] 안에 dot(.)이 들어가면 . 그대로를 의미


2.2 "\" ( 백슬래쉬)

- \s 를 사용할 경우 그 자체임을 알려주기 위해서 \\

- "\\section"을 뽑아내기 위해서는 "\\\\section을 써야하는 문제...

=> 이런 문제들을 해결하기 위해 Raw string: 

p = re.compile(r"\\section")


#11.17 현재 백슬래쉬 문제 해결 안됨... 



3. "[]" (대괄호)

-가능한 문자열의 집합과 일치. 

-[abc] : a, b, c 중 한개의 문자와 배치

-"-"(하이픈)을 사용하면 두 문자 사이의 범위: [0-5] 는 [012345]와 동일, [a-c]는 [abc]와 동일, 

ex) [a-zA-Z], [0-9], [^0-9] (대괄호 안에 ^는 not의 의미를 가짐.)

*자주 사용하는 문자 클래스- 별도의 표기법으로 표현 가능

- \d : 숫자와 매치, [0-9]

- \D; 숫자가 아닌 것과 매치 [^0-9]

- \s: space 문자와 매치, 

- \S: space 문자가 아닌것과 매치

- \w: 문자+숫자와 매치, [a-zA-Z0-9]와 동일,

- \W; 문자, 숫자가 아닌 문자와 매치, [^a-zA-Z0-9]와 동일

(대문자 = 소문자의 반대)


4.1 반복 (*)

-* 바로 앞에 있는 문자가 0~무한대로 반복 가능

ex) ca*t : cat, ct, caaaaat 등 다 매치

[abc]* : 0 or more a, b, c


4.2. 반복 (+)

-+는 최소 1번 이상 반복 될 때 사용

ex) ca+t: cat, caaat 매치, ct는 매치 X

[abc]+: 1 or more a, b, or c


4.3. 반복 ({m, n}, ?)

(1). {m}

-m번만큼 반복

-[xyz]{5} ; x, y, z중 하나가 5번 옴

ex) ca{2}t: a가 2번 반복 : caat (Match)

(2). {n,m}

-n~m번 만큼 반복

ex) ca{2, 5}t: caat, caaaat (match) / cat (X)

(3). ?

-{0, 1}을 의미; 즉 있어도 되고 없어도 된다!

ex) ca?t: ct, cat 모두 Match, 

[]안에 쓰일때는 \?로 escape


5. whitespace

-space: \s

ex) \s+ : 스페이스(공백)가 1번 이상/ 스페이스 또한 타 문자와 동일하게 쓰인다

-tab: \t

-new lie: \n


6. start and ending
- ^: 문자의 시작

- $: 문자의 끝



7. 기타 메타문자들

 

- | : 'or'로 사용됨

-^ : 문자열의 맨 처음

-$ : 문자열의 맨 끝

-\A : 문자열의 처음, ^과 동일하지만 MULTILINE 사용해도 라인별 검색 X

-\Z : \A와 동일

-\b : word boundary(단어 구분자), whitespace로 인해 구분되는 단어 자체를 검색해줌

문자열 안에 포함된 것은 검색 안됨.

-\B : \b와 반대. 



8. Grouping

* ()로 묶어서 그룹핑: 주로 특정 문자열을 찾기 위해서 쓰임.


>>> p = re.compile(r"(\w+)\s+(\d+[-]\d+[-]\d+)") >>> m = p.search("park 010-1234-1234") >>> print(m.group(2)) 010-1234-123


-위의 예와 같이 ()로 묶인 각각이 그룹이 됨.

-group(0): 매치된 전체 문자열


*그룹핑 재참조

-\n: n번째 그룹 참조


>>> p = re.compile(r'(\b\w+)\s+\1') >>> p.search('Paris in the the spring').group() 'the the'

# 위의 예제에서는 (\b\w+)라는 그룹을 뒤에서 \1로 재참조하여 "the the"라는 구문을 뽑아냄


*그룹핑에 이름 붙이기


(?P<groupname>...)


>>> p = re.compile(r"(?P<name>\w+)\s+((\d+)[-]\d+[-]\d+)") >>> m = p.search("park 010-1234-1234") >>> print(m.group("name")) park

-위에서 볼 수 있듯이 그룹명으로 그룹을 참조할 수 있다

-재참조시에는 (?P=name) 형식으로 사용



* 파이썬에서 정규표현식 사용하기

import re

p = re.compile('ab*') 

# p라는 패턴객체를 이용하여 이후의 작업을 수행


-4가지 메쏘드를 사용하여 검색

1) match(): 문자의 처음부터 정규식과 매치, 매치 객체 리턴

2) search(): 문자열 전체를 검색, 매체 객체 리턴

3) findall(): 정규식과 매치되는 모든 문자열 => 리스트화

4) finditer() : 모든 문자열을 iterator 객체롤 리턴.. / 객체가 포함하는 요소는 match객체

- 리턴된 매치 객체 (<_sre.SRE_Match object at 0x01F3F9F8>)의 메소드
1) group(): 문자열

2) start(): 시작위치

3) end():끝 위치

4) span():시작, 끝 (tuple 형식)


>>> m = p.match("python") >>> m.group() 'python' >>> m.start() 0 >>> m.end() 6 >>> m.span() (0, 6)


-compile options

1) DOTAIL, S

- '.'(dot)이 줄바꿈 문자(\n)도 검색 가능하게 함/ 주로 여로줄로 이뤄진 텍스트에서 \n 상관 없이 검색하고자 할떄!


p = re.compile('a.b', re.DOTAIL)


2) IGNORECASE, I

- 대/소문자 구분 없이 매치 수행

ex) [a-z] => 대/소문자 구분 없이 매칭


3) MULTILINE, M

- ^라는 메타문자는 원래 문자열 전체에서 첫번째만 매치.

- Multiline 사용시 각 라인의 처음에서 매치


import re p = re.compile("^python\s\w+", re.MULTILINE) data = """python one life is too short python two you need python python three""" print(p.findall(data))


=> 원래대로라면 python one만 나와야 하는데 / MULTILINE으로 인해 python one, two, three 모두 나옴



4) VERBOSE, X

- 복잡한 정규식을 사용할 경후 주석/ 라인 단위로 구분하여 이해하기 쉽게! 


-re.VERBOSE 옵션을 사용하면 문자열에 사용된 whitespace는 컴파일 시 제거된다(단 [ ] 내에 사용된 whitespace는 제외). 그리고 줄 단위로 #기호를 이용하여 주석문을 작성할 수 있다.




*정규표현식 적용:


-URL 뽑기: 

http://regexone.com:80/page
scheme(http), host(regexone.com), port(80), resource path(page)
schema    (\w+)://
host          ://([\w\.-_]+)
port         (:(\d+))   # 소괄호를 바깥에 씌운 이유는 port가 없는 것도 뽑을수 있게끔 ?를 주기 위해서