다음 코드에서 '[0-9]+'은 0부터 9까지 문자가 1번 이상 반복되는 패턴을 의미합니다. 이것은 즉, 정수로 이루어진 데이터를 찾는 것입니다.
또한 findall 메서드는 x라는 문자열에 존재하는 패턴('[0-9+]')을 모두 리스트로 저장해주는 기능을 합니다. 따라서, 이 코드는 x라는 문자열에서 정수 형태의 데이터를 모두 추출하여 y에 저장을 하는 코드입니다.
import re
x = 'My 2 favorite numbers are 19 and 42'
y = re.findall('[0-9]+',x)
print(y)
# ['2', '19', '42']
다음 코드는 'A','E','I','O','U'로 이루어진 패턴을 찾아 출력하는 코드이지만 x 문자열에 해당되는 패턴이 없어서 빈 리스트를 출력합니다. 여기서 알 수 있는 사실은 정규 표현식에서는 소문자와 대문자를 구분한다는 사실입니다.
import re
x = 'My 2 favorite numbers are 19 and 42'
y = re.findall('[AEIOU]+',x)
print(y)
# [] (빈 리스트 출력)
만약 다음 문장에서 '^F.+:'라는 패턴과 일치하는 부분을 찾는다면,
x = 'From: Using the : character'
From:
From: Using the :
이라는 두 가지 부분이 모두 패턴과 일치하게 됩니다.
이럴 때는 다음과 같이 가장 긴 패턴을 찾아주는데, 이것을 '탐욕적 방식의 패턴 찾기'라고 부릅니다. 일치하는 여러 패턴이 있을 경우 가장 긴 것을 선택한다는 의미입니다.
import re
x = 'From: Using the : character'
y = re.findall('^F.+:', x)
print(y)
# ['From: Using the :']
물론 탐욕적이지 않은 방식으로 패턴을 찾을 수도 있습니다.
다음 코드에서처럼 패턴 뒤에 '?'(물음표)를 붙여주면 여러 대상 중 가장 짧은 것을 선택하게 됩니다.
import re
x = 'From: Using the : character'
y = re.findall('^F.+?:', x)
print(y)
# ['From:']
다음 코드를 실행하면 '@' 문자 앞 뒤로 공백이 아닌 문자가 오는 문자열 패턴을 찾아줍니다. 따라서 다음과 같이 이메일 주소의 패턴이 추출됩니다.
x = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('\S+@\S+',x)
print(y)
# ['stephen.marquard@uct.ac.za’]
그리고 다음과 같이 From으로 시작하는 이메일 주소 패턴에서 이메일 주소 부분만 추출할 수도 있습니다. 소괄호를 사용해서 말이죠.
x = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('^From (\S+@\S+)',x)
print(y)
# ['stephen.marquard@uct.ac.za']