본문 바로가기
자연어처리(NLP) & CHAT GPT/NLP

[NLP] 중요한 정규표현식

by 11car28z 2023. 7. 30.

<참고 도서>

https://dojang.io/course/view.php?id=7&section=55 

 

강좌: 파이썬 코딩 도장, 섹션: Unit 43. 정규표현식 사용하기

 

dojang.io

43.1 문자열 판단하기

 

#문자열 속에 패턴이 존재? 질문에 대한 답 출력

re.match('패턴', '문자열') #잘 안쓰임

re.search('패턴', '문자열') #잘 안쓰임

 

findall #잘 쓰임

find #잘 쓰임

 

43.1.1 문자열이 맨 앞에 오는지 맨 뒤에 오는지 판단하기

^문자열 #제일 앞에 있나?

문자열$ #제일 뒤에 있나?

 

>>> re.search('^Hello', 'Hello, world!') # Hello로 시작하므로 패턴에 매칭됨

<_sre.SRE_Match object; span=(0, 5), match='Hello'>



>>> re.search('^Hello', 'Hi Hello, world!') #매치X





>>> re.search('world!$', 'Hello, world!') # world!로 끝나므로 패턴에 매칭됨

<_sre.SRE_Match object; span=(7, 13), match='world!'>



>>> re.search('world!$', 'Hello, world') #매치X

---------------------------------------------------------------

43.1.2 지정된 문자열이 하나라도 포함되는지 판단하기

문자열|문자열

문자열|문자열|문자열|문자열

-> OR 연산자

---------------------------------------------------------------

43.2 범위 판단하기*****

패턴 중요! 패턴이 있으면 어디부터 어디까지 있나요

[0-9]*

[0-9]+

*는 문자(숫자)0개 이상 있는지, +1개 이상 있는지 판단

 

[] : 한 문자 의미

 

ex) [a]: a문자 의미,

[ab]:a또는 b문자 의미,

[a-c] : a 또는 b 또는 c문자 의미

 

#0부터 9까지 숫자가 0개 이상 존재하면 매치

>>> re.match('[0-9]*', '1234')

<_sre.SRE_Match object; span=(0, 4), match='1234'>

 

>>> re.match('[0-5]*', '1234') #매치o

>>> re.match('[0-4]*', '1234') #매치o

>>> re.match('[5-9]*', '1234') #매치o – 5-9가 0개 이상이기때문

>>> re.match('[a-z]*', '1234') #매치o – a-z가 0개 이상이기때문

>>> re.match('[a-z]*', 'abc1234') #매치o – a-z가 0개 이상이기때문

>>> re.match('[0-9a-z]*', 'abc1234') #매치o – 0-9, a-z가 0개 이상이기때문

>>> re.match('[0-9a-zA-Z]*', 'XYabc1234') #매치o – 0-9, a-z, A-Z가 0개 이상이기때문

>>> re.match('[0-9a-zA-Z]*', '홍길동XYabc1234') #매치o – 0-9, a-z, A-Z가 0개 이상이기때문

>>> re.match('[0-9a-zA-Zㄱ-ㅎ가-힣]*', '홍길동XYabc1234') #매치o – 0-9, a-z, A-Z, ㄱ-ㅎ, 가-힣가 0개 이상이기때문

>>> re.match('[0-9a-zA-Zㄱ-ㅎ가-힣]*', 'ㅋㅋㅋ홍길동XYabc1234') #매치o – 0-9, a-z, A-Z, ㄱ-ㅎ, 가-힣가 0개 이상이기때문

 

 

매치O

res = re.match('[0-3]*', '1234')

res



if res: #매치O 결과는 True로 인식된다.

print(“매치O”)

else:

print(“매치X”)

 

매치X None 리턴 -> if문에서 False로 해석

res = re.match('[가-마]*', '1234')

res



if res: #매치O 결과는 True로 인식된다.

print(“매치O”)

else:

print(“매치X”)

 

 

match 잘 안쓴다. 참고만해라 / 문자열 속에 이 패턴이 있는지 확인하는 것이 중요!!!!!!!!!!!!!!

>>> re.match('[0-9]+', '1234')

>>> re.match('[0-9]+', '가1234')

>>> re.match('[0-9]+[가-힣]', '12가34')

>>> re.match('[0-9]+[가-힣]*', '12가34')

>>> re.match('[0-9]+[가-힣]+[0-9]', '12가34')

>>> re.match('[0-9]+[가-힣]+[0-9]*', '12가34')

>>> re.match('[0-9]+[가-힣]+[0-9]+a', '12가34abc')

>>> re.match('[0-9]+[가-힣]+[0-9]+aa', '12가34abc') #매치x – 패턴중 aa가 없다.

>>> re.match('[0-9]+[가-힣]+[0-9]+ab', '12가34abc')

>>> re.match('[0-9]+[가-힣]+[0-9]+[a-c]', '12가34abc') #a까지 매치

>>> re.match('[0-9]+[가-힣]+[0-9]+[a-c]+', '12가34abc') #전체 매치

 

---------------------------------------------------------------

43.2.1 문자가 한 개만 있는지 판단하기

문자? : ? 앞의 문자(범위)0개 또는 1개인지 판단

[0-9]? :

. : .이 있는 위치에 아무 문자(숫자)1개 있는지 판단

---------------------------------------------------------------

43.2.2 문자 개수 판단하기

문자{개수}

(문자열){개수}

: 문자(숫자)가 정확히 몇 개 있는지 판단

 

#동일한 코드

>>> re.match('h{3}', 'hhhello')

>>> re.match('hhh', 'hhhello')

 

#문자열 반복

>>> re.match('(hello){3}', 'hellohellohelloworld')

 

(문자){시작개수,끝개수}

(문자열){시작개수,끝개수}

[0-9]{시작개수,끝개수}

:문자(숫자)의 개수 범위도 지정

>>> re.match('[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}', '02-100-1000') # 2~3개-3~4개-4개 패턴에 매칭됨

<_sre.SRE_Match object; span=(0, 11), match='02-100-1000'>

---------------------------------------------------------------

43.2.4 특정 문자 범위에 포함되지 않는지 판단하기

[^범위]* : 제외한 모든 문자(숫자)0개 이상

[^범위]+ : 제외한 모든 문자(숫자)1개 이상

>>> re.match('[^0-9]+', 'Hello')

>>> re.match('[^0-9]+', 'hello가나다')

---------------------------------------------------------------

43.2.5 특수 문자 판단하기*****

\d: [0-9]와 같음. 모든 숫자

\D: [^0-9]와 같음. 숫자를 제외한 모든 문자

\w: [a-zA-Z0-9_]와 같음. 영문 대소문자, 숫자, 밑줄 문자

\W: [^a-zA-Z0-9_]와 같음. 영문 대소문자, 숫자, 밑줄 문자를 제외한 모든 문자

 

#동일

>>> re.match('\d+', '1234')

>>> re.match('[0-9]+', '1234')



>>> re.match('\W+', '(:)')

>>> re.match('[^a-zA-Z0-9_]+', '(:)')

---------------------------------------------------------------

43.2.6 공백 처리하기*****

\s: [ \t\n\r\f\v]와 같음. 공백(스페이스), \t() \n(새 줄, 라인 피드), \r(캐리지 리턴), \f(폼피드), \v(수직 탭)을 포함

\S: [^ \t\n\r\f\v]와 같음. 공백을 제외하고 \t, \n, \r, \f, \v만 포함

---------------------------------------------------------------

43.3 그룹 사용하기**

(정규표현식) (정규표현식)

매치객체.group(그룹숫자)

m = re.match('([0-9]+) ([0-9]+)', '10 295') #()안에 있는 것만 신경쓰기 - 그룹하나다

>>> m.group(1) # 첫 번째 그룹(그룹 1)에 매칭된 문자열을 반환

'10’

---------------------------------------------------------------

매치객체.groups()

>>> m.groups() # 각 그룹에 해당하는 문자열을 튜플 형태로 반환

('10', '295')

---------------------------------------------------------------

**

(?P<이름>정규표현식) : 그룹 이름 + 패턴 만들기

매치객체.group('그룹이름')

>>> m = re.match('(?P<func>[a-zA-Z_][a-zA-Z0-9_]+)\((?P<arg>\w+)\)', 'print(1234)')

>>> m.group('func') # 그룹 이름으로 매칭된 문자열 출력

'print'

>>> m.group('arg') # 그룹 이름으로 매칭된 문자열 출력

'1234’

 

그룹1 : (?P<func>[a-zA-Z_][a-zA-Z0-9_]+)

func 함수, 패턴 [a-zA-Z_][a-zA-Z0-9_]+ -> [a-zA-Z_] 범위 반드시 한글자 이상, [a-zA-Z0-9_]반드시 한글자 이상

 

그룹2 : (?P<arg>\w+)

arg 함수, 패턴 \w+ -> \w+ = [0-9a-zA-Z_] 범위 반드시 한글자 이상

 

---------------------------------------------------------------

43.3.1 패턴에 매칭되는 모든 문자열 가져오기

re.findall('패턴', '문자열') *****

:패턴에 매칭되는 모든 문자열을 가져오기

>>> re.findall('[0-9]+', '1 2 Fizz 4 Buzz Fizz 7 8')

['1', '2', '4', '7', '8']

 

 

>>> re.match('[0-9]+', '1 2 Fizz 4 Buzz Fizz 7 8')

0번째 매치o, 1번째 매치x



>>> re.match('[0-9 ]+', '1 2 Fizz 4 Buzz Fizz 7 8')

0~4번째 매치o



>>> re.match('[0-9]+', 'Fizz 1 2 Fizz 4 Buzz Fizz 7 8') #처음부터 패턴 없으면 매치x

>>> re.search('[0-9]+', 'Fizz 1 2 Fizz 4 Buzz Fizz 7 8') #계속 패턴 찾기



>>> re.findall('[0-9]+', 'Fizz 1 2 Fizz 4 Buzz Fizz 7 8')