INSPECT
Python 정규표현식 본문
[Python 정규표현식]
정규표현식을 웹에서 테스트, 설명을 제공
\d : 0부터 9까지 숫자
\w : 숫자와 문자(대소문자 포함), _(언더스코어) 포함
\s : 공백문자(tab포함)
. : \n(엔터)을 제외한 모든 문자
*문자.(점)을 나타내고 싶을 때는 앞에 역슬래시를 붙인다.
or은 | 표시. ()로 grouping
[] 속에 글자들은 순서에 관계없이 한 글자를 표현
? : 0 또는 1번 발생(zero or one)
* : 0 또는 여러 번 발생(zero or many)
+ : 1번 이상 발생(one or many)
{n} : n번 발생
ex) [0-9]{3} : 0부터 9까지의 숫자가 3번 연속 발생한다.
* 웹 주소 패턴 표현하기
/문자를 표현할 때 : 이스케이프를 사용(\/)
/b : 바운더리를 표현
() : 괄호를 사용하여 그룹을 적절히 활용
.(dot) 문자 : 와일드카드, \n 문자 제외하고 모든 묹에 대응
실제로 .을 표시하고 싶으면 \.으로 사용
^ : 시작을 표시
$ : 끝을 표시
\b - 양쪽에 문자가 없다. 이게 끝이다는 의미
https일수도 http일 수도 있기 때문에 s?로 표시
http자체가 붙어있을 수도 안붙어있을 수도 있기 때문에 그룹화해서 ?표시
여러개의 글자(+)와 .(dot)이 한번 또는 두번 발생(ex. naver.co)
.(dot) 뒤에 글자가 두글자~네글자. 한번 혹은 두번 발생(ex. .kr, .com)
* 정규식을 사용한 텍스트 패턴 검색
- match() : 원하는 문자열 패턴으로 소스 문자열과 일치하는지 비교
result = re.match('hello, 'hello world') # 'hello'는 패턴이고 'hello world'는 확인할 소스 문자열이다.
result : 결과가 None이면 매칭이 실패했다는 의미
- 패턴을 미리 컴파일 할 수 있다.
phonenum_regex = re.compile(r'\d\d\d-\d\d\d\d-\d\d\d\d)
*패턴과 소스를 비교하는 다른 방법
search() : 첫 번째 일치하는 객체를 반환
findall() : 모두 일치하는 문자열을 리스트로 반환
split() : 패턴에 맞게 소스를 쪼갠 후 문자열 조각의 리스트를 반환
sub() : 바꾸기 기능, 패턴과 일치하는 소스의 부분을 대체인자로 변경 - 바꾸기 기능
1 2 3 4 5 6 7 8 9 10 11 12 13 | >>> import re >>> phonenum_regex = re.compile(r'\d\d\d-\d\d\d\d-\d\d\d\d') >>> mo = phonenum_regex.search('My number is 010-1234-1234.') >>> mo <_sre.SRE_Match object; span=(13, 26), match='010-1234-1234'> >>> mo.group() '010-1234-1234' >>> type(mo) <class '_sre.SRE_Match'> | cs |
1. re 모듈 임포트 : import re
2. re.complie()함수로 Regex 객체를 생성(raw string 사용)
3. search() 함수의 파라미터로 검색할 문자를 전달
- Match 객체를 반환
4. group() 함수로 실제 매칭된(검색된) 문자열 리턴
* 그룹핑 : 괄호를 사용하여 정규식(regex)에 그룹을 생성할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | >>> import re >>> phonenum_regex = re.compile(r'(\d\d\d)-(\d\d\d\d-\d\d\d\d)') >>> mo = phonenum_regex.search('My number is 010-1234-1234.') >>> mo <_sre.SRE_Match object; span=(13, 26), match='010-1234-1234'> >>> mo.group(1) '010' >>> mo.group(2) '1234-1234' >>> mo.group() '010-1234-1234' >>> mo.groups() ('010', '1234-1234') >>> a, b = mo.groups() >>> a '010' >>> b '1234-1234' | cs |
- (\d\d\d)-(\d\d\d\d-\d\d\d\d) : group() 함수 사용
a, b = mo.groups() : 튜플 언패킹(Tuple unpacking)
튜플이 패킹이 풀어져서 각각 a에는 010 b에는 뒷자리 숫자가 할당된다.
* findall() : 모두 일치하는 문자열을 리스트로 반환
- search()는 매칭되는 첫 번째 패턴을 반환, findall() 모든 패턴을 반환
1 2 3 4 | >>> import re >>> mo = phonenum_regex.findall('Cell : 010-1234-1234 Work: 080-1234-1234') >>> mo [('010', '1234-1234'), ('080', '1234-1234')] | cs |
* 플래그 : I (ignore의 약자)와 VERBOSE
- 대소문자 구분 무시 : re.I
1 2 3 4 5 6 7 8 9 | import re >>> robocop = re.compile(r'robocop', re.I) >>> robocop.search('Robocop is part man, part machine, all cop.').group() 'Robocop' >>> robocop.search('ROBOCOP protects the innocent.').group() 'ROBOCOP' | cs |
- 복잡한 정규식 표현 : re.VERBOSE
1 2 3 4 5 6 7 8 | import re email_regex = re.compile(r'''( [a-zA-Z0-9._%+-]+ # username @ # @ symbol [a-zA-Z0-9.-]+ # domain name (\.[a-zA-Z]{2,4}){1,2} #dot-something )''', re.VERBOSE) | cs |
* 이메일 추출기 만들기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import re import pyperclip email_regex = re.compile(r'''( [a-zA-Z0-9._%+-]+ # username @ # @ symbol [a-zA-Z0-9.-]+ # domain name (\.[a-zA-Z]{2,4}){1,2} # dot-something )''', re.VERBOSE) def find_match_list(): # 클립보드에 복사된 내용에서 이메일 패턴과 매치되는 텍스트를 찾는다. text = pyperclip.paste() matches = [] for email in email_regex.findall(text): matches.append(email[0]) return matches def copy_result_to_clipboard(matches): # Copy results to the clipboard. if len(matches) > 0: pyperclip.copy('\n'.join(matches)) # join은 list에 있는 내용을 특정 구분자로 결합 print('클립보드에 복사되었습니다.') else: print('매칭되는 패턴이 없습니다.') def main(): matches = find_match_list() copy_result_to_clipboard(matches) main() | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | John.Smith@example.com jsmith@example.com john.smith@example.org John..Doe@example.com john.smith@example.com john.smith@example.com .xyz@example.com xyz@example.com ghi@example.com jsmith@example.com JSmith@example.com john.smith@example.com john.smith@example.com prettyandsimple@example.com very.common@example.com disposable.style.email.with+symbol@example.com other.email-with-dash@example.com fully-qualified-domain@example.com user.name+tag+sorting@example.com user.name@example.com x@example.com very.unusual.@.unusual.com example-indeed@strange-example.com example@s.solu c@example.com l@example.com right@example.com allowed@example.com allowed@example.com 1234567890123456789012345678901234567890123456789012345678901234+x@example.com john..doe@example.com john.doe@example..com joeuser+tag@example.com joeuser@example.com foo+bar@example.com foobar@example.com | cs |
'Python' 카테고리의 다른 글
Python3 문자열 (0) | 2017.09.26 |
---|---|
python3 모듈 패키지 (0) | 2017.09.26 |
Python2와 Python3 같이 사용하기 (0) | 2017.09.26 |
Python 2.x와 3.x (0) | 2017.09.06 |
[Python Django] 참고 사이트 (0) | 2017.02.06 |