일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Spring Core
- 파이썬 예외처리
- Mybatis#조건
- 오라클 #Oracle #DB #database #12C
- 정보통신용어 #Agent #
- maVen
- JAVA #JDK #1.8 #JAVA 환경변수 # CLASS_PATH #시스템 변수 # 사용자 변수
- SpringFramework
- 오라클 환경 변수
- 따라해보세요
- Java
- Library
- Spring Context
- 파이썬 모듈
- 향상된 for문
- 파이썬 패키지
- window10
- 정보통신용어 #Proxy #Proxy Server
- MySQL설치 # DB # 초보자 #Oracle친구
- 웅스주니어개발자 #MySQL # Window10 # CMD # 초보자 #환경변수
- Java #객체 #클래스 #인스턴스
- 추상화란? # 결론은 객체들의 공통적인 개념
- Today
- Total
IT흔적
[파이썬]정규표현식의 기초[2] - re모듈(match, 컴파일 옵션) 본문
정규표현식을 지원하는 re 모듈
>>> import re
>>> p = re.compile('ab*')
# 정규 표현식을 컴파일한다. re.compile의 결과로 리턴되는 객체p(컴파일된 패턴 객체)를 이용하여 그 이후의 작업을 수행할것.
정규식을 이용한 문자열 검색
메서드 |
목적 |
||
match() |
문자열의 처음부터 정규식과 매치되는지 조사한다. |
||
search() |
문자열 전체를 검색하여 정규식과 매치되는지 조사한다. | ||
findall() |
정규식과 매치되는 모든 문자열(substring)을 리스트로 리턴한다. | ||
finditer() | 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 리턴한다. |
match() 하고 search()는 정규식과 매치될 때는 mach객체를 리턴하고 매치되지 않을떄는 None을 리턴한다.
>>> import re
>>> p = re.compile('[a-z]+') # a에서 z까지 문자열에서 z가 최소1번 ~ 무한 사용되어여 매치가능
위 예제를 사용해서 진행해 보겠습니다.
1.match 메서드는 문자열의 처음부터 정규식과 매치되는지 조사한다. 위 패턴에 match 메서드를 수행해 보자.
>>> p = re.compile("[a-z]+") >>> m = p.match("python") >>> print(m) <re.Match object; span=(0, 6), match='python'>
# 매치되지않는 숫자를 사용했을때 값
>>> m = p.match("3 python") >>> print(m) None
2.search는 컴파일된 패턴 객체를 이용해 수행해보자
>>> m = p.search("python") >>> print(m) <re.Match object; span=(0, 6), match='python'>
>>> m = p.search("3 python") >>> print(m) <re.Match object; span=(2, 8), match='python'>
# search 메서드는 전체를 검색하서 매치되는곳부터 시작한다!
3.findall : 모든 문자열들을 리스트[] 안에 나타낸다.
import re
a = re.compile('[a-z]+')
b = a.findall("Liverpool is rank first")
print(b)
# 출력값 : ['iverpool', 'is', 'rank', 'first']
4.finditer : 반복객체를 리턴한다.import rea = re.compile('[a-z]+')b = a.finditer("Liverpool is rank first")print(b)# <callable_iterator object at 0x00000000027FAEF0>for i in b:print(i)# 출력값 :# <re.Match object; span=(1, 9), match='iverpool'># <re.Match object; span=(10, 12), match='is'># <re.Match object; span=(13, 17), match='rank'># <re.Match object; span=(18, 23), match='first'>
match 객체의 메서드
메서드 |
목적 |
group() |
매치된 문자열을 리턴한다. |
start() |
매치된 문자열의 시작 위치를 리턴한다. |
end() |
매치된 문자열의 끝 위치를 리턴한다. |
span() |
매치된 문자열의 (시작, 끝)에 해당되는 튜플을 리턴한다. |
import re
a = re.compile('[a-z]+')
b = a.match("liverpool")# result = re.match('[a-z]+', "liverpool") 모듈 단위로 가능하다.
b.group()# liverpool 문자열을 그대로 나타낸다.
b.start()# 0 위치열을 알려준다 l이 [0]에서 시작하기떄문에 0이다.
b.end()
# 9 마지막 문장위치열이 9이다.
b.span()
# (0, 9) (처음, 끝) 을 알려주는 튜플을 출력 한다.
컴파일 옵션
# 1.DOTALL, S
'''
Dot(.) 메타 문자는 줄바꿈 문자(\n)를 제외한 모든 문자와 매치되는 규칙이 있다. 만약 \n 문자도 포함하여 매치하고 싶다면
re.DOTALL 또는 re.S 옵션을 사용해 정규식을 컴파일하면 된다.
'''
# 제이름을 앞글자 마지막글자를 이용해서 만들어 봤습니다.
import re
>>> a = re.compile('강.웅', re.S)
>>> b = a.match('강\n웅')
>>> print(b)
# 값: <re.Match object; span=(0, 3), match='강\n웅'> 이런식으로 \n 문자까지 포함하고 있습니다.
# 정리: DOTALL(S)는 문자가 아닌것을 같이 쓰고 싶을때 사용한다.
# 2.IGNORECASE, I
'''
대'소문자에 관계없이 매치할 수 있도록 한다.
'''
import re
>>> a = re.compile('[a-z]', re.I)
>>> a.match('python')
# 값: <re.Match object; span=(0, 1), match='p'>
>>> a.match('PYTHON')
# 값: <re.Match object; span=(0, 1), match='P'>
# 정리: IGNORECASE(I)는 대.소문자 상관없이 값이 출력된다.
# 3.MULTULUNE, M
'''
메타 문자에 대해 간단히 설명하자면 ^는 문자열의 처음을 의미하고, $은 문자열의 마지막을 의미한다
'''
import re
p = re.compile("^python\s\w+") # s\w : whitespace뜻이고 뒤에 단어가 와야한다.
data = """python one
life is too short
python two
you need python
python three"""
print(p.findall(data))
# 값: ['python one']
import re
p = re.compile("^python\s\w+", re.MULTILINE)
data = """python one
life is too short
python two
you need python
python three"""
print(p.findall(data))
# 값 : ['python one', 'python two', 'python three']
import r
p = re.compile("python$\s\w+", re.MULTILINE)
data = """life is too short
python one
you need python
python two
you are handsome
python three"""
print(p.findall(data))
# 값: ['python\npython']
# 정리:re.M 옵션으로 인해서 ^메타 문자가 문자열 전체가 아닌 라인의 처음이라는 의미를 갖게 되고 옵션에 ^, $ 문자열의 각 라인마다 적용
백슬래쉬 문제
: 정규표현식을 파이썬에서 사용하려 할 때 혼란을 주게 되는 요소가 한가지 있는데 그것은 바로 백슬래시(\)이다.
ex) \section -> 이 정규식은 \s 문자가 whitespace로 해석되어 의도한 대로 매치가 이루어지지 않는다.
[\t\n\r\f\v]ection -> \s 문자가 이스케이프 코드 \t,\n,\r,\f,\v로 해석됨
\\section
위 정규식을 컴파일 할 때
>>> p = re.compile('\\section')
정규식 엔진에는 파이썬 문자열 리터럴 규칙에 의하여 \\-> \로 변경됨
정규식 엔진에서는
>>> p = re.compile('\\\\section')
!!! 이럴때는
>>> p = re.compile(r'\\section')
# 이 정규식은 Raw String규칙에 의하여 백슬래시 2개 대신 1개만 써도 2개를 쓴 것과 동일한 의미를 갖게 된다.
'DO it! Python' 카테고리의 다른 글
[파이썬] 정규표현식의 기초[1] - 메타 문자 (0) | 2019.01.22 |
---|