728x90
반응형
43. 정규표현식
43.1 문자열 판단
print(re.match('Hello', 'Hello, world!'))
print(re.match('python', 'hello, world!'))
==========================
<re.Match object; span=(0, 5), match='Hello'>
None
# 문자열 위치 판단
# ^문자열, 문자열$
print(re.search('^hello', 'hello, world'))
print(re.search('world$', 'hello, world'))
==========================
<re.Match object; span=(0, 5), match='hello'>
<re.Match object; span=(7, 12), match='world'>
# 지정된 문자열 하나라도 포함여부
# 문자열|문자열
# 문자열|문자열|문자열|문자열
print(re.match('hello|world', 'hello'))
==========================
<re.Match object; span=(0, 5), match='hello'>
43.2 범위 판단
# [0-9]* : 0개 이상 있는지
# [0-9]+ : 1개 이상 있는지
print(re.match('[0-9]*', '1234'))
print(re.match('[0-9]+', '1234'))
print(re.match('[0-9]+', 'abcd'))
==========================
<re.Match object; span=(0, 4), match='1234'>
<re.Match object; span=(0, 4), match='1234'>
None
print(re.match('a*b', 'b'))
print(re.match('a+b', 'b'))
print(re.match('a*b', 'aab'))
print(re.match('a+b', 'aab'))
==========================
<re.Match object; span=(0, 1), match='b'>
None
<re.Match object; span=(0, 3), match='aab'>
<re.Match object; span=(0, 3), match='aab'>
# 문자가 한개만 있는지 판단
print(re.match('abc?d', 'abd')) # abd에서 c위치에 c가 0개 있으므로 매칭됨
print(re.match('ab[0-9]?c', 'ab3c')) # 0-9 위치에 숫자가 1개 있으므로 패턴에 매칭됨
print(re.match('ab.d', 'abxd')) # .이 있는 위치에 문자가 1개 있으므로 패턴에 매칭됨
==========================
<re.Match object; span=(0, 3), match='abd'>
<re.Match object; span=(0, 4), match='ab3c'>
<re.Match object; span=(0, 4), match='abxd'>
# 문자 개수 판단하기
print(re.match('h{3}', 'hhhello'))
print(re.match('(hello){3}', 'hellohellohelloworld'))
==========================
<re.Match object; span=(0, 3), match='hhh'>
<re.Match object; span=(0, 15), match='hellohellohello'>
print(re.match('[0-9]{3}-[0-9]{4}-[0-9]{4}', '010-1000-1000'))
print(re.match('[0-9]{3}-[0-9]{4}-[0-9]{4}', '010-1000-100')) # 매칭되지 않음
==========================
<re.Match object; span=(0, 13), match='010-1000-1000'>
None
print(re.match('[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}', '02-100-1000'))
print(re.match('[a-zA-Z0-9]+', 'Hello1234'))
print(re.match('[A-Z0-9]+', 'hello')) # 대문자, 숫자는 없고 소문자만 있으므로 패턴에 매칭되지 않음
==========================
<re.Match object; span=(0, 11), match='02-100-1000'>
<re.Match object; span=(0, 9), match='Hello1234'>
None
print(re.match('[^A-Z]+', 'Hello')) # 대문자를 제외한 모든 문자(숫자)가 1개 이상 - 매칭되지 않음
print(re.match('[^A-Z]+', 'hello')) # 대문자가 없으므로 매칭
==========================
None
<re.Match object; span=(0, 5), match='hello'>
print(re.search('^[A-Z]+', 'Hello'))
print(re.search('[0-9]+$', 'Hello1234'))
==========================
<re.Match object; span=(0, 1), match='H'>
<re.Match object; span=(5, 9), match='1234'>
# 특수문자 판단
# \ 특수문자
print(re.search('\*+', '1 ** 2')) # *가 들어가는지 판단
print(re.match('[$()a-zA-Z0-9]+', '$(document)')) # $, (, )와 문자, 숫자가 들어가는지 판단
==========================
<re.Match object; span=(2, 4), match='**'>
<re.Match object; span=(0, 11), match='$(document)'>
# \d : 모든숫자 (==[0-9])
# \D : 숫자를 제외한 모든 문자 (== [^0-9])
# \w : 영문 대소문자, 숫자, 밑줄문자 (== [a-zA-Z0-9_])
# \W : 영문 대소문자, 숫자, 밑줄문자를 제외한 모든 문자 (== [^a-zA-Z0-9_])
# 공백 처리
print(re.match('[a-zA-Z0-9]+', 'Hello 1234')) # ' '로 공백 표현
print(re.match('[a-zA-Z0-9\s]+', 'Hello 1234')) # \s로 공백 표현
==========================
<re.Match object; span=(0, 5), match='Hello'>
<re.Match object; span=(0, 10), match='Hello 1234'>
# 같은 정규표현식 패턴을 자주 사용할 때
p = re.compile('[0-9]+')
print(p.match('1234'))
==========================
<re.Match object; span=(0, 4), match='1234'>
43.3 그룹 사용하기
m = re.match('([0-9]+) ([0-9]+)', '10 295')
print(m.group(1)) # 첫 번째 그룹에 매칭된 문자열 반환
print(m.group(2)) # 두 번째 그룹에 매칭된 문자열 반환
print(m.group()) # 매칭된 문자열 모두 반환
print(m.group(0)) # 매칭된 문자열 모두 반환
==========================
10
295
10 295
10 295
# 매치객체.groups()
print(m.groups()) # 각 그룹에 해당하는 문자열을 튜플 형태로 반환
==========================
('10', '295')
m = re.match('(?P<func>[a-zA-Z_][a-zA-Z0-9_]+)\((?P<arg>\w+)\)', 'print(1234)')
print(m.group('func'))
print(m.group('arg'))
==========================
print
1234
# 패턴에 매칭되는 모든 문자열 가져오기
print(re.findall('[0-9]+', '1 2 Fizz 4 Buzz Fizz 7 8'))
==========================
['1', '2', '4', '7', '8']
43.4 문자열 바꾸기
print(re.sub('apple|orange', 'fruit', 'apple box orange tree'))
print(re.sub('[0-9]+', 'n', '1 2 Fizz 4 Buzz Fizz 7 8'))
==========================
fruit box fruit tree
n n Fizz n Buzz Fizz n n
def multiple10(m):
n = int(m.group())
return str(n * 10)
print(re.sub('[0-9]+', multiple10, '1 2 Fizz 4 Buzz Fizz 7 8'))
==========================
10 20 Fizz 40 Buzz Fizz 70 80
# 찾은 문자열을 결과에 다시 사용
print(re.sub('([a-z]+) ([0-9]+)', '\\2 \\1 \\2 \\1', 'hello 1234'))
print(re.sub('({\s*)"(\w+)":\s*"(\w+)"(\s*})', '<\\2>\\3</\\2>', '{"name": "james"}'))
==========================
1234 hello 1234 hello
<name>james</name>
728x90
반응형
'Language > Python' 카테고리의 다른 글
[코딩도장]45.모듈과 패키지 만들기 (0) | 2022.04.20 |
---|---|
[코딩도장]44. 모듈과 패키지 사용 (0) | 2022.04.19 |
[코딩도장]42.데코레이터 (0) | 2022.04.12 |
[코딩도장]41.코루틴 (0) | 2022.04.11 |
[코딩도장]40.제너레이터 (0) | 2022.04.06 |