728x90
정규 표현식
메타문자
메타 문자 | 사용예 | 설명 | |
[ ] | 문자 클래스 | [abc] | a, b, c 중 한 개의 문자와 매치 |
[s-e] | [0-2] [a-c] [a-zA-Z] [0-9] |
0,1,2 a,b,c 알파벳모두 숫자 |
|
^ | 반대 | [^0-9] | 숫자가 아닌 문자와 매치 |
? | 0또는1글자 (있어도 되고 없어도 되고) |
ab?c | ?앞에 문자 b를 0 또는 1번 반복 O abc O ac X abbc |
. | 1글자 | a.b a[.]b |
a + 모든문자 + b a + Dot(.)문자 + b |
* | 반복 0~ | ca*t | *앞에 문자 a를 0~ 반복 O ct O cat O caaat |
+ | 반복 1~ | ca+t | +앞에 문자 a를 1~ 반복 X ct O cat O caaat |
{s,e} | 반복 s~e | {3,5} {3, } { ,5} {1, } {0, } ca{2}t ca{2,4}t |
3이상 ~ 5이하 반복 3~ 이상 반복 ~5 이하 반복 + * {2}앞에 문자a를 2번반복 X cat O caat {2}앞에 문자a를 2 ~ 4번반복 X cat O caat O caaaat |
^…$ Starts and ends
(…) Capture Group
(a(bc)) Capture Sub-group
(.*) Capture all
(abc|def) Matches abc or def
자주 사용하는 문자 클래스
종류 | 문자클래스 | 설명 | 유사표현 |
숫자 | \d | 숫자와 매치 | [0-9] |
\D | 숫자가 아닌 것과 매치 | [^0-9] | |
숫자+문자 | \w | 문자+숫자(alphanumeric)와 매치 | [a-zA-Z0-9_] |
\W | 문자+숫자(alphanumeric)가 아닌 문자와 매치 | [^a-zA-Z0-9_] | |
특수문자 | \s | whitespace 문자와 매치 | [ \t\n\r\f\v] |
\S | whitespace 문자가 아닌 것과 매치 | [^ \t\n\r\f\v] |
import re 정규식을 이용한 문자열 검색
종류 | 설명 |
match() | 문자열의 처음부터 정규식과 매치되는지 검사 (처음부터 매치안되면 None) |
search() | 문자열 전체에서 정규식과 매치되는지 검사 |
findall() | 정규식과 매치되는 모든 문자열(substring)을 리스트로 반환 |
finditer() | 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 반환 |
import re
- re.함수('패턴', '검색대상문자열')
m = re.match('[a-z]+', "python")
#'python'에서 a-z까지 값을 매치해라
print(m)
출력 값: <re.Match object; span=(0, 6), match='python'>
#0부터6까지 자리의 값 'python'
m = re.match('[a-z]+', "10python")
print(m)
출력 값: None #처음부터 매치X라 None
- 패턴 '[a-z]+'를 매번 쓰기 귀찮다
- 패턴 컴파일 -> [패턴변수.search("검색대상문자열")]
p = re.compile('[a-z]+') #패턴 변수에 담기
m = p.search("python") #패턴변수.search("검색대상문자열")
print(m)
m = p.search("3 python") #패턴변수.search("검색대상문자열")
print(m)
출력 값:
<re.Match object; span=(0, 6), match='python'>
<re.Match object; span=(2, 8), match='python'>
- match()
- 컴파일된 패턴 '[a-z]+'를 가지고 match() 메서드 수행
m = re.match('ab*', "python") #a [b를 0부터 반복가능] ex) a, ab, abb, abbb
print(m)
m = re.match('[a-z]+', "python") #[a-z]+ -> 알파벳이 1개 이상 매치
print(m, m.group())
m = re.match('[a-z]+', "3 python")
print(m)
출력 값:
None
<re.Match object; span=(0, 6), match='python'> python
None
- search()
- 컴파일된 패턴 객체 '[a-z]+'를 가지고 search() 메서드 수행
p = re.compile('[a-z]+') #패턴 담아두기
m = p.search("3 python") #패턴.search('검색대상문자열')
print(m)
출력 값:
<re.Match object; span=(2, 8), match='python'>
- findall()
- 컴파일된 패턴 객체 '[a-z]+'를 가지고 findall() 메서드 수행 - 정규식과 매치되는 리스트 반환
p = re.compile('[a-z]+') #패턴 담아두기
m = p.findall("3 life is 100 too short 100")
print(m)
출력 값:
['life', 'is', 'too', 'short']
- finditer()
- 컴파일된 패턴 객체 '[a-z]+'를 가지고 finditer() 메서드 수행 - 정규식과 매치되는 iterator 객체 반환
- 따로 객체를 for문 돌려서 출력해줘야함
m = p.finditer("a b cde 100")
print(m)
for match_obj in m:
print(match_obj, '\t', match_obj.group())
출력 값:
<callable_iterator object at 0x00000127DBB9D1C0>
<re.Match object; span=(0, 1), match='a'> a
<re.Match object; span=(2, 3), match='b'> b
<re.Match object; span=(4, 7), match='cde'> cde
Quiz
- ref : https://regexone.com/
(1)정규식 a[.]{3,}b과 매치되는 문자열?
acccb
a....b
aaab
a.cccb
acccb
a....b
aaab
a.cccb
(2)다음은 무엇을 표현하기 위한 정규식인가?
".*[@].*[.].*$"
>>> 이메일
r"(\w+)\s+\d+[-]\d+[-]\d+"
>>>이름, 전화번호
(3) 확장자 txt만 찾기
m = re.findall("\w*[.]txt", "abc.txt abc.jpg a100.txt")
print(m)
(4) 한글 이름만 찾기
m = re.findall(f"[^a-zA-Z\s]+", "James 홍길동 아무개")
print(m)
m = re.findall("[가-힣]+", "James 홍길동 아무개")
print(m)
'Python > 문법' 카테고리의 다른 글
파이썬 - 함수 중급 (0) | 2022.01.10 |
---|---|
파이썬 - 자료형 심화 (1) | 2022.01.09 |
파이썬 - enumerate 함수 (0) | 2022.01.04 |
파이썬 - 예외 처리 (0) | 2022.01.03 |
파이썬 - 모듈 (0) | 2021.12.31 |
댓글