본문 바로가기

교육/Pyhotn 180709-180713

5일차 정규식

정규식 기본

반복 메타 문자

 *

0회 이상 반복 

ap*le > apple, ale, aple 

 +

1회 이상 반복

ap+le > apple, aple

 ?

0회 또는 1회 

ap?le > aple, ale

 {m}

m회 반복 

ap{2}le > apple 

 {m,n}

m회부터 n회까지 반복

ap{2,4}le > apple, appple, apppple

매칭 메타 문자

 .

줄바꿈 문자를 제외한 모든 문자와 매치됨

ki.i > kiwi, ki3i, ki#i

 ^

문자열의 시작과 매치됨

input - "apple kiwi banana"

output - ^ap > ap

 $

문자열의 마지막과 매치됨

input - "apple kiwi banana"

output - nana$ > nana

 []

문자 집합 중 한 문자를 의미

이 안에 있는 ^ 문자는 not 의 의미

ki[v-x]i > kivi, kiwi, kixi

ki[vwx]i > kivi, kiwi, kixi

 |

또는(or)를 의미

input - "apple kiwi"

output - apple|straw > apple

 ()

정규식을 그룹으로 묶음

Match 객체의 group 란 참고

이스케이프 기호

\d

모든 숫자와 매치됨 [0-9]

\d > 0, 1, ... , 9

\D

숫자가 아닌 문자와 매치됨 [^0-9]

\D > a, b ...

\s

화이트 스페이스 문자와 매치됨 [ \t\n\r\f\v]

\s > 공백

\S

화이트 스페이스가 아닌 것과 매치됨 [^ \t\n\r\f\v]

\S > 공백아닌것

\w

숫자 또는 문자와 매치됨 [a-zA-Z0-9_]

\w > _, a, Z ...

\W

숫자 또는 문자가 아닌 것과 매치됨 [^a-zA-Z0-9_]

\W > 공백 등

\b

단어의 경계를 나타냄. 단어는 영문자 혹은 숫자의 연속 문자열
'\b' 처럼 하면 비프음으로 인식하므로 r'\b' 처럼 r 키워드를 사용하여 비프음이 아닌 정규식\b로 이해되게끔 해야함

input - 'apple myapptest application tom'

output - r'\bapp\w+\b' > ['apple', 'application']

\B

단어의 경계가 아님을 나타냄

input - 'apple myapptest application tom'
output - r'\Bapp\B' > app
myapptest 에서의 app 임

\A

문자열의 처음에만 일치

^ 와 동일한 의미

\Z

문자열의 끝에만 일치

$ 와 동일한 의미

최소 매칭을 위한 정규식

 *?

 *와 같으나 문자열을 취소로 매치함

 

 +?

 +와 같으나 문자열을 취소로 매치함

 

 ??

 ?와 같으나 문자열을 최소로 매치함

 

 {m,n}?

 {m,n}과 같으나 문자열을 최소로 매치함

 


정규 표현식에서 사용 가능한 플래그

 I, IGNORECATE

 대, 소문자를 구별하지 않는다

 

 L, LOCATE

 \w, \W, \b, \B를 현재의 로케일에 영향을 받게 한다

 

 M , MULTILINE

 ^가 문자열의 맨 처음, 각 라인의 맨 처음과 매치 된다

$는 문자열의 맨 끝, 각 라인의 맨 끝과 매치

 

 S, DOT ALL

 .을 줄바꾸기 문자도 포함하여 매치하게 한다

 

 U, UNICODE

 \w, \W, \b, \B가 유니코드 문자 특성에 의존하게 한다

 

 X, VERBOSE

 정규식 안의 공백은 무시된다

 


re모듈의 주요 메소드

compile(pattern[, flags])

pattern을 컴파일하여 정규식 객체를 반환

c = re.compile(r'apple')

match = c.search(string)

print(match.group())

match(pattern, string[,flags])

string의 시작부분부터 pattern이 존재하는지 검사하여

MatchObject 인스턴스를 반환


search(pattern, string[,flags])

string의 전체에 대해서 pattern이 존재하는지 검사하여

MatchObject 인스턴스를 반환


split(pattern, string[, maxplit=0])

pattern을 구분자로 string을 분리하여 리스트로 반환

str = 'aaa-bbb#ccc.ddd eee'

s = re.split('[-#. ]', str) # - 는 맨 앞이나 뒤에 써야함. a-z 처럼 사이값을 나타내므로

print(s) # ['aaa', 'bbb', 'ccc', 'ddd', 'eee']

findall(pattern, string[, flags])

string에서 pattern을 만족하는 문자열을 리스트로 반환

 

finditer(pattern, string[, flags])

string에서 pattern을 만족하는 문자열을 반복자로 반환

str = 'apple kiwi banana application'

match = re.finditer('app\w+', str)

for m in match:

    print(m.group()) # apple, application

sub(pattern, repl, string[, count=0])

string에서 pattern과 일치하는 부분에 대하여, repl로 교체하여 결과 문자열을 반환

TC1)

str = 'apple kiwi banana application'

s = re.sub('app\w+', 'like', str)

print(s) # 'like kiwi banana like'


TC2)

def fn(m): # m = match 객체

    return 'add_' + m.group() # m 앞에 add_ 문자열 붙임


str = 'apple kiwi banana application'

s = re.sub('app\w+', fn, str)

print(s) # 'add_apple kiwi banana add_application'

subn(pattern, repl, string[, count=0])

sub와 동일하나, 결과로(결과문자열, 매칭횟수)를 튜플로 반환

 

escape(string)

영문자 숫자가 아닌 문자들을 백슬래쉬 처리해서 리턴.

(임의의 문자열을 정규식 패턴으로 사용할 경우 유용)

 



Match 객체

group([group1, ...])

 입력받은 인덱스에 해당하는 매칭된 문자열 결과의 부분 집합을 반환합니다.

인덱스가 '0'이거나 입력되지 않은 경우 전체 매칭 문자열을 반환합니다.

s = '123-abc def-ghi 346-Abc'

match = re.search("(\d{3})-([a-z]{3})", s)

print(match.group()) # 123-abc

print(match.group(1)) # 123

print(match.group(2)) # abc

groups()

 매칭된 결과를 튜플 형태로 반환

print(match.groups()) # ('123', 'abc')

groupdict()

 이름이 붙여진 매칭 결과를 사전 형태로 반환

 

start([group])

 매칭된 결과 문자열의 시작 인덱스를 반환. (인자로 부분 집합의 번호나

명시된 이름이 전달된 경우, 그에 해당하는 시작 인덱스를 반환)

 

end([group])

 매칭된 결과 문자열의 종료 인덱스를 반환. (인자로 부분 집합의 번호나

명시된 이름이 전달된 경우, 그에 해당하는 종료 인덱스를 반환)

 

pos

 원본 문자열에서 검색을 시작하는 위치입니다

 

endpos

 원본 문자열에서 검색을 종료하는 위치입니다

 

lastindex

 매칭된 결과 집합에서 마지막 인덱스 번호를 반환. (일치된 결과가 없는 경우

에는 None을 반환)

 

lastgroup

 매칭된 결과 집합에서 마지막으로 일치한 이름을 반환. (정규식의 매칭 조건에

이름이 지정되지 않았거나 일치된 결과가 없는 경우 None 반환)

 

string

 매칭의 대상이 되는 원본 문자열입니다.

 


'교육 > Pyhotn 180709-180713' 카테고리의 다른 글

4일차 sqlite  (0) 2018.07.12
4일차 python 확장 - C 언어  (0) 2018.07.12
3일차 library  (0) 2018.07.11
3일차 Class  (0) 2018.07.11
2일차 module  (0) 2018.07.10