Notice
Recent Posts
Recent Comments
«   2025/04   »
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
Tags
more
Archives
Today
Total
관리 메뉴

INSPECT

Python 정규표현식 본문

Python

Python 정규표현식

INSPECT 2017. 9. 26. 04:39

[Python 정규표현식]


regex101.com

regexr.com

정규표현식을 웹에서 테스트, 설명을 제공


\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=(1326), 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=(1326), 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

https://en.wikipedia.org/wiki/Email_address 페이지 복사 후 코드실행 후 붙여넣기 결과


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
Comments