<참고 도서>
https://dojang.io/course/view.php?id=7§ion=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')
'자연어처리(NLP) & CHAT GPT > NLP' 카테고리의 다른 글
| [NLP] 신경망기반 텍스트 분류 - 개념 (0) | 2023.08.01 |
|---|---|
| [NLP] 언어 모델링 - 실습 (0) | 2023.07.31 |
| [NLP] 언어 모델링 - 개념 (0) | 2023.07.29 |
| [NLP] 텍스트전처리 - 실습 (0) | 2023.07.28 |
| [NLP] 텍스트전처리 - 개념 (0) | 2023.07.27 |