a*: a를 0회 이상 반복을 뜻한다. a, aa, aaaaa는 a 그 자체를 의미한다.예시) 전화번호: 000 - 0000 - 0000 => 000, 0000: 메타문자, '-': 리터럴
[ ][ ] 사이의 문자들과 매칭-를 이용해 범위 지정[^ 패턴]: ^로 시작하는 경우 '오면 안 되는 패턴'을 의미한다.\w\w: 문자와 숫자, _와 매치. 특수문자를 제외한 일반 문자를 말한다.\s: 공백 문자와 매치.+, {m, n}+: 앞에 문자(패턴)과 일치하는 문자가 1개 이상인 경우.r'\d+': 숫자 한 개 이상{m}: 앞의 문자(패턴)가 m개.r'\d{2}'{m,}: 앞의 문자(패턴)가 m개 이상.,) 뒤에 공백이 들어오지 않도록 한다. a{3, } (X){m,n}: 앞의 문자(패턴)이 m개 이상 n개 이하. ^, $^: 문자열의 시작. ^abc[ ])의 ^와는 의미가 다르다.$: 문자열의 끝. abc$., ( ). 한 개의 모든 문자 (\n 줄바꿈 제외) (\.은 문자 그래도 점(.)을 의미)( ): 패턴 내 하위그룹을 만들 때 사용rere를 사용한다. p = re.compile(r'\d+')
p.search('abc123def')
re 모듈의 원하는 작업을 하는 함수를 호출한다. Argument로 패턴과 처리할 값을 전달한다. re.search(r'\d+', 'abc123def')
match(): 패턴으로 "시작하는 지"match(대상문자열 [,pos=0])Nonesearch(): 패턴이 "있는지"search(대상문자열 [, pos=0])Nonefindall(): 매칭되는 문자열들을 "리스트"로 반환findall(대상문자열)finditer(): 매칭되는 결과들을 조회할 수 있는 "Iterator"를 반환finditer(대상문자열)next()시 StopIteration Exception이 발생한다.sub(): 변경된 문자열 반환sub(바꿀문자열, 대상문자열[, count=양수])import re
txt = " 월요일 좋아 ~~~ "
# txt.strip() # 좌우 공백 제거
# txt.replace(" ", "") # 개수가 일치해야 한다.
result = re.sub(r" +", " ", txt.strip()) # 공백들을 한 개 공백으로 변경 (패턴, 바꿀 문자열, 대상)
result
# 출력 결과: '월요일 좋아 ~~~'

subn(): 변경된 문자열과 변경 개수를 튜플로 반환sub()와 동일한 역할(변경된 문자열, 변경된 문자열 개수)를 튜플로 반환p = re.compile(r" +")
result = p.subn(" ", txt.strip())
print(type(result), len(result))
result
# 출력 결과
# type(result): <class 'tuple'>
# len(result): 2
# result: ('월요일 좋아 ~~~', 2)

그룹핑.. 을 볼때마다 항상 티니핑이 생각난다.
?를 붙인다. *?+?{m,n}?txt = """
<ul>
<li>python</li>
<li>java</li>
</ul>
"""
# txt(html)에서 태그들을 조회
# "<ul>, <li>, </li>, <li>, </li>, </ul>"
p1 = r"<.+>" # <a>, <ul>, <section class='c1'>
p2 = r"<.+?>" # .+ 뒤 패턴의 문자를 처음 만나면 수량사 처리를 끝내라라
result1 = re.findall(p1, txt)
print(result1)
# ['<ul>', '<li>python</li>', '<li>java</li>', '</ul>']
result2 = re.findall(p2, txt)
print(result2)
# ['<ul>', '<li>', '</li>', '<li>', '</li>', '</ul>']
<li>python</li><li>python</li> 끝까지!'<li>', '</li>'