import re
pat = re.compile("(\d{6})[-]\d{7}")
pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub("\g<1>-*******", data))
ex : [abc] -> a b c 중 한개의 문자와 매치한다.
'a' 는 'a'가 있으므로 매치
'before' 는 'b'가 있으므로 매치
'dude' 는 매치하지 않는다.
[]사이에 - 를 이용하면 문자 사이의 범위를 의미한다.
[a-c]라는 정규표현식은 [abc]와 동일하다.
[0-5]는 [012345]와 동일하다.
ex : [a-zA-Z] 알파벳 모두 [0-9] 숫자
[]안에는 어떠한 문자나 메타문자도 사용할 수 있지만, ^는 주의하자.
^는 not 의 의미를 가지고 있다.
ex : [^0-9] : 숫자가 아닌 문자만 매치된다.
[0-9] 또는 [a-zA-Z] 등은 무척 자주 사용하는 정규 표현식이다.
#### 이렇게 자주 사용하는 정규식은 별도의 표기법으로 표현할 수 있다. 다음을 기억해 두자.
\d - 숫자와 매치, [0-9]와 동일한 표현식이다.
\D - 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.
\s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.
\S - whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.
\w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다.
\W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다.
대문자로 사용된 것은 소문자의 반대임을 추측할 수 있다.
ex : a.b 는 a + 모든문자 + b 이다.
'aaab' -> 매치
'a0b' -> 매치
'abc' -> 한글자라도 있어야하므로 매치되지 않는다.
ex : ca*t 의 정규식은
ct -> 매치
cat -> 매치
caaaaat -> 매치
ca+t의 정규식은, a를 한번이상 반복이다.
ct -> 매치안됨.
caaat -> 매치
{m,n} 반복횟수가 m부터 n까지 매치할 수 있다.
{3,} -> 반복횟수가 3이상인 경우
{,3} -> 반복횟수가 3이하인 경우.
{1,} -> +
{0,} -> *
ex : ca{2}t : c a를 두번이상 반복 t
ca{2,5}t 는 a를 2~5 번반복만 매치.
ab?c ->
abc는 b가 1번이상이라 매치
ac 는 b가 0번이라 매치.
import re
p = re.compile('ab*')
정규식을 컴파일한 결과
re.compile을 사용하여 정규표현식을 컴파일 한다.
위 예시 서는 ab*를 컴파일한다.
re.compile의 결과로 돌려주는 객체 p = 컴파일된 패턴 객체를 사용하여 그이후의 작업을 수행한다.
옵션을 주는것도 가능하다.
p = re.compile('[a-z]+') # 뜻 : abcd...z까지 1번이상 반복하는가?
문자열이 처음부터 정규식과 매치가 되는가?
print("match 예시 : ")
match = p.match("python") # 정규식에 부합하는 지 팔별한다. python은 정규식에 부합한다.
print(match)
match = p.match("3 python") # 3 python 은 정규식에 부합하지 않는다.
print(match)
print()
간단한 예시
p = re.compile(정규표현식)
m = p.match( 'string goes here' )
if m:
print('Match found: ', m.group())
else:
print('No match')
match와 비슷하지만, 문자열의 전체를 검색한다.
print("search")
p = re.compile("[a-z]+")
search = p.search("3 python")
print(search)
print()
문자열의 각각 단어를 각각 정규식(p , 여기서는 [a-z]+)와 매치해서 리스트로 되돌려준다. (매치되는 것만 되돌려 준다.)
print("findall 예시 : ")
p = re.compile("[a-z]+")
findall = p.findall("only a fool could walk away from me this time cloud 9 ")
print(findall)
print()
findall과 동일하지만, 결과로 반복가능한 객체 (iterator object)를 돌려줌.
반복가능한 객체가 포함하는 각각의 요소는 match객체이다.
역시 매치 되는 것만 알려준다.
print("finditer 예시 : ")
p = re.compile("[a-z]+")
finditer = p.finditer("I need to find out where I am before I reach the stars")
print(finditer)
for r in finditer :
print(r)
print()
match 메소드 search 메소드를 수행한 결과로 돌려주는 match객체를 다룬다.
앞에서 정규식을 사용한 문자열 검색을 수행하면서 어떤 문자열인지, 인덱스는 무엇인지 알려준다.
group() 매치된 문자열을 돌려준다.
start() 매치된 문자열의 시작 위치를 돌려준다.
end() 매치된 문자열의 끝 위치를 돌려준다.
span() 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 돌려준다.
매치된 문자열을 알려준다.
print("match객체의 메소드")
print("정규표현식 컴파일된 패턴객체 p = [a-z]+ / m은 match 객체")
m = p.match("python")
print("group() : ")
print(m.group())
매치된 문자열의 시작 위치를 알려준다.
print("start() : ")
print(m.start())
매치된 문자열의 끝 위치를 알려준다.
print("end() : ")
print(m.end())
매치된 문자열의 시작과 끝에 해당하는 튜플을 알려준다.
print("span() : ")
print(m.span())
해당하는문자열을 제거
re.sub('apple|orange', 'fruit', 'apple box orange tree')
# 문자열에서 apple, orange를 찾아서, fruit로 바꾼다.
# 팁 : 매치하는 과정을 다음과 같이축약할 수 있다.
m = re.match('[a-z]+', "python")
문자열 소비가 없는 문자
A|B 정규식이 있다면 A 또는 B가 의미가 된다.
p = re.compile('Crow|Servo')
m = p.match('CrowHello')
print(m)
문자열 맨처음과 일치하는가?
print(re.search('^Life', 'Life is too short'))
print(re.search('^Life', 'My Life'))