*자주 사용하는 메타문자 예시:
메타문자 설명
\d 숫자 [0-9]와 같다.
\D 비숫자 [^0-9]와 같다.
\w 숫자 + 문자 [a-zA-Z0-9]와 같다.
\W 숫자 + 문자가 아닌 것 [^a-zA-Z0-9]와 같다.
\s 공백 [ \t\n\r\f\v]와 같다.
\S 비공백 [^ \t\n\r\f\v]와 같다.
\b 단어 경계 (`\w`와 `\W`의 경계)
\B 비단어 경계
[ ] 문자 클래스
. \n을 제외한 모든 문자와 매치 (점 하나는 글자 하나를 의미)
* 0회 이상 반복 (업어도 상관 없음)
+ 1회 이상 반복 (무조건 한번 이상 등장해야 함)
{m, n} m회 이상 n회 이하
l or 조건식을 의미
^ 문자열의 시작 의미
$ 문자열의 끝을 의미
? 0회 이상 1회 이하
+ 1회 이상
\ 이스케이프, 또는 메타 문자를 일반 문자로 인식하게 한다
( ) 그룹핑, 추출할 패턴을 지정한다.
(?=) 긍정형 전방탐색
(?!) 부정형 전방탐색
(?<=) 긍정형 후방탐색
(?<!) 부정형 후방탐색
<참고: 정규표현식 이메일 작성 예시>
<소스코드_1>
import re
print(re.findall(r'at', 'The cat in the hat sat there'))
print(re.findall(r'.at', 'The cat in the hat sat there'))
print(re.findall(r'...at', 'The cat in the hat went splat'))
*출력결과*:
['at', 'at', 'at']
=> re.search 메소드를 통해서 'at'과 동일한 글자를 모두 찾아냈다.
['cat', 'hat', 'sat']
=> 온점 ' . ' 의 기능 때문에 'at' 앞에 character 한 개가 더 붙은 문자 패턴을 모두 찾아냈다.
['e cat', 'e hat', 'splat']
=> 출력결과에 ' . ' 앞에 e가 더 붙은 이유는 '...' 이 전, 전전 글자를 다 (White Space 포함) 가르키기 때문이다.
<소스코드_2>
print(re.findall(r'^\d','1 is a number'))
print(re.findall(r'\d$','The number is 2'))
*출력결과*:
['1']
=> ' ^ ' 의 역할 때문에 숫자로 시작하는 텍스트만 찾음!
['2']
=> ' $ '의 역할 때문에 숫자로 끝나는 텍스트만 찾음!
<소스코드_3>
phrase = 'there are 5 numbers 37 inside 4 this sentence'
pattern1 = r'[^\d]'
pattern2 = r'[^\d]+'
print(re.findall(pattern1, phrase))
print(re.findall(pattern2, phrase))
*출력결과*:
['t', 'h', 'e', 'r', 'e', ' ', 'a', 'r', 'e', ' ', ' ', 'n', 'u', 'm', 'b', 'e', 'r', 's', ' ', ' ', 'i', 'n', 's', 'i', 'd', 'e', ' ', ' ', 't', 'h', 'i', 's', ' ', 's', 'e', 'n', 't', 'e', 'n', 'c', 'e']
=> 숫자가 아닌 모든 글자 하나하나 추출하는 수식
['there are ', ' numbers ', ' inside ', ' this sentence']
=> 바로위 pattern1 처럼 모든 글자를 하나하나 추출하지 않고 숫자가 없는 단어끼리 한데 묶어서 단어 그대로 추출하는 표현
<소스코드_4>
test_phrase = 'This is a string! But it has punctuation. How can we remove it?'
print(re.findall(r'[^!.?]+', test_phrase))
clean = re.findall(r'[^!.? ]+', test_phrase)
print(clean)
print(' '.join(clean))
*출력결과*:
['This is a string', ' But it has punctuation', ' How can we remove it']
=> 모든 특수문자 기호 없애는 표현법
['This', 'is', 'a', 'string', 'But', 'it', 'has', 'punctuation', 'How', 'can', 'we', 'remove', 'it']
=> 각 단어별로 잘라서 반환하는 표현법.
This is a string But it has punctuation How can we remove it
=> 바로 윗줄과 비교해보기. 이 라인은 모든 특수기호 없애고 하나의 문장으로 만드는 기능 수행함
<소스코드_5>
text_hypen = 'Only find the hypen-words in this sentence. But you do not know how long-ish they are. 1234567890.'
pattern3 = r'[\w]+'
print(re.findall(pattern3, text_hypen))
pattern4 = r'[\w]+-[\w]+'
#위 patter4에서는 여기서 대괄호를 쓰지 않아도 의도한 코드 결과 도출에는 문제가 없으나, 가독성 향상을 위해서 통상적으로 그루핑을 하며 대괄호를 써준다.
print(re.findall(pattern4,text_hypen))
*출력결과*:
['Only', 'find', 'the', 'hypen', 'words', 'in', 'this', 'sentence', 'But', 'you', 'do', 'not', 'know', 'how', 'long', 'ish', 'they', 'are', '1234567890']
=> Alphanumeric 단어를 추출하는 표현법, 알파벳과 숫자만 정상적으로 추출 및 반환됨.
['hypen-words', 'long-ish']
=> hypen 있는 단어만 추출하는 표현법.
<소스코드_6>
text_one = "catfish"
text_two = "catnap"
text_three = "caterpillar"
print(re.search(r'cat(fish|nap|pillar)', text_one))
print(re.search(r'cat(fish|nap|pillar)', text_two))
print(re.search(r'cat(fish|nap|erpillar)', text_three))
*출력결과*:
re.Match object; span=(0, 7), match='catfish'
re.Match object; span=(0, 6), match='catnap'
re.Match object; span=(0, 11), match='caterpillar'
=> Cat이 붙은 단어를 '|' (또는) 기능 써서 찾는 표현법
1) 이메일 :
</^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i>
2) 전화번호 : /^\d{3}-\d{3,4}-\d{4}$/
3) 핸드폰 번호 : /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/
출처: https://hamait.tistory.com/342 [HAMA 블로그]