728x90
반응형
SMALL
728x90
반응형
LIST
728x90
반응형
SMALL
Python 정규식의 표현 및 사용방법을 알아보자.
알아두면 매우 유용하게 사용할 수 있다.

 

■ 정규식 : [] 안에 . ^ $ * + ? { } [ ] \ | ( ) 을 사용하는 식

표현식 동일 표현식 설명
\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_] 문자, 숫자 아닌 것과 매치
.   a.d 사이에 들어가는 모든 문자와 매치 (Yes : abcd, abd    No : ade, a0e)
ab*c   * 바로 앞에 있는 문자 b가 0부터 매치 (ac, abc, abbc 모두 매치)
ab+c   * 과 동일, 다른점은 문자 b가 1부터 매치 (ac는 매치 안됨)
ab{2}c   b가 2번 반복 되어야 매치 (Yes : abbc    No : abc)
ab{2,5}c   b가 2~5번 반복되면 매치
ab?c ab{0,1}c b가 0~1번 반복되면 매치
^abc   문자열의 처음은 항상 abc로 시작하면 매치 (re.MULTILINE 일 경우 라인별 첫 문자)
\Aabc   문자열의 처음은 항상 abc로 시작하면 매치 (re.MULTILINE 과 상관없음)
abc$   문자열의 마지막은 항상 abc로 끝나면 매치 (re.MULTILINE 일 경우 라인별 첫 문자)
abc\Z   문자열의 마지막은 항상 abc로 끝나면 매치 (re.MULTILINE 과 상관없음)
abc|def   abc 또는 def가 있으면 매치
\babc\b   앞뒤로 스페이스가 있을 경우에만 매치
\Babc\B   앞뒤로 스페이스가 없을 경우에만 매치

 

■ 정규식 응용

import re

p = re.compile('[a-z]+')

 

m = p.match("abc")    # 문자열 처음부터 정규식과 매치되는지 확인

print(m)    # 결과값 : <re.Match object span=(0, 3), match='abc'>

 

m = p.match("00abc")

print(m)    # 결과값 : None

 

m = p.search("abc")    # 문자열 전체를 검색하여 정규식과 매치되는지 확인

print(m)    #과값 : <re.Match object; span=(0, 3), match='abc'>

 

m = p.search("00abc")

print(m)    # 결과값 : <re.Match object; span=(2, 5), match='abc'>

 

m = p.findall("a b c")    # 리스트로 반환

print(m)    # 결과값 : ['a', 'b', 'c']

 

m = p.finditer("abc def ghi")    # 반복 가능한 개체로 돌려줌

print(m)    # 결과값 : <callable_iterator object at 0x000001886C72FFD0>

for i in m:

    print(i)

# 결과값

# <re.Match object; span=(0, 3), match='abc'>

# <re.Match object; span=(4, 7), match='def'>

# <re.Match object; span=(8, 11), match='ghi'>


참고) 위 2줄은 아래 1줄로 사용할 수 있음.

p = re.compile('[a-z]+')

m = p.match("abc")

 

m = re.match('[a-z]+', "abc")


# #1, #2의 차이점

import re

 

p = re.compile("^abc\s\w+")    #1

p = re.compile("^abc\s\w+", re.MULTILINE)    #2

 

data = """abc one

abc two

abc three"""

 

print(p.findall(data))    # 결과값 : ['abc one'] - 첫 번째 줄만 매치    #1

print(p.findall(data))    # 결과값 : ['abc one', 'abc two', 'abc three'] - 라인별로 매치    #2


# '\abc'를 찾을 때는 \를 하나 더 쓴다. '\\abc'를 찾을 때는 '\\\\abc' 이렇게 사용한다.

p = re.compile("\\abc")

 

# 간단하게 사용하는 방법은 앞에 r을 붙이면 된다. 

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


# 전화번호 형태의 정규식

p = re.compile(r"(?P<name>\w+)\s+(?P<phone>\d+[-]\d+[-]\d+)")

m = p.search("mobile 010-1234-5678")

 

print(m.group(0))    # 결과값 : mobile 010-1234-5678 (전체 문자열 반환)

print(m.group(1))    # 결과값 : mobile (괄호로 묶인 1번째 문자열 반환)

print(m.group("name"))    # 결과값 : mobile (괄호로 묶인 1번째 문자열을 name이라는 이름을 통하여 문자열 반환)

print(m.group(2))    # 결과값 : 010-1234-5678 (괄호로 묶인 2번째 문자열 반환)


# 문자열 바꾸기

p = re.compile("(park|kim|lee)")

m = p.sub("first", "park name and kim name")

print(m)    # first name and first name

 

p = re.compile(r"(?P<name>\w+)\s+(?P<phone>\d+[-]\d+[-]\d+)")

m = p.sub("\g<phone> \g<name>", "mobile 010-1234-5678")

print(m)    # 결과값 : 010-1234-5678 mobile

728x90
반응형
LIST

+ Recent posts