-
파이썬 정규표현식 사용파이썬 2019. 9. 19. 00:39반응형
정규표현식(regular expression)은 일정한 규칙(패턴)을 가진 문자열을 표현하는 방법입니다.
복잡한 문자열 속에서 특정한 규칙으로 된 문자열을 검색한 뒤 추출하거나 바꿀 때 사용합니다.
또는 문자열이 정해진 규칙에 맞는지 판단할 때도 사용합니다.
정규표현식을 처음 접하면 외계어 같아서 어려워하는 사람들이 많습니다. 하지만 부분부분 쪼개서 학습하면 어렵지 않다네요.. : (
먼저 문자열에 특정 문자열이 포함되어 있는지 판단해 보겠습니다.
정규표현식은 re 모듈을 가져와서 사용해 match함수에 정규표현식 패턴과 판단할 문자열을 넣습니다.
- re = regular expression의 약자입니다!
re.match('패턴', '문자열')
지금부터 'Hello, world!' 문자열에 'Hello' 와 'Python'이 있는지 판단합니다.
import re re.match('Hello', 'Hello, world!') # 문자열이 있으므로 정규표현식 매치 객체가 반환됨!
out : <re.Match object; span=(0, 5), match='Hello'>
re.match('Python', 'Hello, world!') # 문자열이 없으므로 아무것도 반환되지 않음!
문자열이 있으면 매치(SRE_Match) 객체가 반환되고 없으면 아.무.것.도 반환되지 않습니다.
여기서는 'Hello' 가 있으므로 match ='Hello' 와 같이 패턴에 매칭된 문자열이 표시됩니다.
사실 이런 판단은 'Hello, world!'.find('Hello')처럼 문자열 메서드로도 충분히 가능합니다. : (
그러면 문자열 메서드로 다 할 수 있으니까 좋을줄 알았죠?...
문자열 메서드로 할 수 없는 판단을 해볼게요! : (
정규표현식은 특정 문자열이 맨앞에 오는지 맨 뒤에 오는지 판단 할 수 있어요.
문자열 앞에 ^을 붙이면 문자열이 맨앞에 오는지 판단하고,
문자열 뒤에 $를 붙이면 문자열이 맨 뒤에 오는지 판단합니다(특정 문자열로 끝나는지).
^문자열
문자열$
이때는 match 대신 search 함수를 사용해야합니다. match 함수는 문자열 처음부터 매칭 되는지 판단하지만 search는 문자열 일부분이 매칭되는지 판단합니다.
re.search('패턴', '문자열')
'^Holle' 는 'Hello, world!'가 'Hello'로 시작하는지 판단하고 'world!$'는 'Hello, world!'가 'world!'로 끝나는지 판단합니다.
re.search('^Hello', 'Hellom world!') # Hello로 시작하므로 패턴에 매칭됨
out : <re.Match object; span=(0, 5), match='Hello'>
re.search('world!$', 'Hello, world!') # world!로 끝나므로 패턴에 매칭됨
out : <re.Match object; span=(7, 13), match='world!'>
보시면 앞에 문자열 출력, 뒤의 문자열 출력 된 결과를 볼 수 있습니다! ^^7
지정된 문자열이 하나라도 포함되는지 판단하기
| (=키보드의 Shift +\ 키) 는 특정 문자열에서 지정된 문자열이 하나라도 포함되는지 판단합니다.
기본개념은 OR연산자와 같습니다!!
문자열 | 문자열
문자열 | 문자열 | 문자열 | 문자열
' Hello | world' 는 문자열에서 'hello' 또는 'world'가 포함되는지 판단합니다.
re.match('hello|world', 'hello') # hello 또는 world 가 있으므로 패턴에 매칭됨!
out : <re.Match object; span=(0, 5), match='hello'>
쪼개서 배우니 좀 해볼만 하네요...
피곤하네...자요~ 다음은 범위를 판단해 볼게요
문자열이 숫자로 되었는지 판단해볼게요.
다음과 같이 [] (대괄호)안에 숫자범위를 넣으며 * 또는 +를 붙입니다. 숫자 범위는 0-9 처럼 ' - ' 을 넣고 범위를 조절하고 *는 문자가 0개 이상있는지, +는 1개 이상있는지 판단합니다.
[0-9]*
[0-9]+
re.match('[0-9]*', '1234') # 1234는 0부터 9 까지 숫자가 0개 이상이므로 결과가 나옴!
out : <re.Match object; span=(0, 4), match='1234'> # 패턴에 매칭됨
re.match('[0-9]+', '1234') # 1234는 0부터 9까지 숫자가 1개 이상 있으므로 결과가 나옴
out : <re.Match object; span=(0, 4), match='1234'> # 패턴에 매칭됨
re.match('[0-9]+', 'abcde') # 1234는 0부터 9까지 숫자가 1개도 없으므로 패턴에 매칭이 안됨!
매칭이 하나도 없으면 출력값이 없어요....
그럼 *와 +의 사용법을 좀 더 코드를 쳐보면서 알아볼게요!
re.match('a*b', 'b') # b에는 a가 0개 이상 있으므로 패턴에 매칭됨
out : <re.Match object; span=(0, 1), match='b'>
re.match('a+b', 'b') # b에는 a가 1개 이상 없으므로 패턴에 매칭되지 않음 re.match('a*b','aab') # aab에는 a가 0개 이상 있으므로 패턴에 매칭됨
out : <re.Match object; span=(0, 3), match='aab'>
re.match('a+b', 'aab') # aab에는 a가 1개 이상있으므로 패턴에 매칭됨
out : <re.Match object; span=(0, 3), match='aab'>
어떻게 돌아가는지 아시겠어요?...
+는 1개이상이므로 하나는 필수로 있어야 되고...
* 0개 이상이므로 무조건 매칭이 되는거 같아요..
이젠 문자가 한 개만 있는지 판단해 볼게요!
문자가 여러 개 있는지 판단할 때는 *, + 를 사용
문자가 한 개만 있는지 판단할 때는 ?와 . 을 사용
? 는 문자0개 또는 1개인지 판단하고,
. 은 문자 1개인지 판단합니다.다음은 문자개수을 판단해볼게요.
문자{개수}
(문자열){개수}
특정 범위의 문자(숫자)가 몇 개 있는지 판단할 수도 있습니다. 이때는 범위[] 뒤에 {개수} 형식을 지정합니당!
[0-9]{개수}
이 기능은 문자의 개수 범위도 지정할 수 있습니다.
{시작개수, 끝 개수} 형식으로 시작과 끝개수를 지정해주면 특정 개수 사이에 들어가는지 판단합니다.
(문자){시작개수, 끝개수}
(문자열){시작개수, 끝개수}
[0-9]{시작개수, 끝개수}
반응형