정규표현식
*정규표현식- 메타 문자
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
'backend > python' 카테고리의 다른 글
파이썬에서 파일 입출력하기 (0) | 2016.11.19 |
---|---|
iterator, generator (0) | 2016.11.19 |
파이썬 데이터 라이브러리 - 수찬님 강의 2일차 복습 (1), 동적인 웹사이트 크롤링 (0) | 2016.11.08 |
jupyterthemes 적용하기 - 이쁘게 쓰자 (0) | 2016.11.08 |
파이썬 selenium 설치 관련 문제 해결 (2) | 2016.11.08 |