2021. 2. 24. 17:12ㆍ카테고리 없음
Regular Expression
그냥은 쓸 수 없고, 파이썬 library "import re"를 작성한 후에 re.search()나 re.findall()등을 사용해서 쓸 수 있다.
re.search는 참거짓을 판별하는 것,
re.findall은 직접 찾아서 추출하는 것이다.
- ^ : 라인의 '첫글자'와 같은 것
- $ : 라인의 '끝글자'와 같은 것
- . : 모든 캐릭터
- \s : whitespace인 것
- \S : whitespace가 아닌것
- * : 0회 이상 반복(0회 포함)
- *? : 0회 이상 반복(0회 포함, non-greedy)
- + : 1회 이상
- +? : 1회 이상(non-greedy)
- [aeiou] : 세트에 있는 캐릭터
- [^XYZ] : 세트에 없는 캐릭터
- [a-z0-9] : 캐릭터가 포함하는 범위
- ( : 추출 시작
- ) : 추츨 끝
re.search()
if line.find('From:') >= 0:
if re.search('From:', line) :
위 두 if조건문은 같은 걸 의미한다. 아래를 하기 위해서는 먼저 import re를 사용해야 한다.
예를 들어서 line.startswith()는 re.search('^From:', line)으로 변경할 수 있다.
re.findall()
y = re.findall('[0-9]+', x)
아래의 [0-9]+ 부분 중에서 [0-9]는 한자리수를 의미하고, +는 하나 혹은 그 이상을 의미하므로, [0-9]+는 일의자리 이상의 모든 숫자를 의미하게 된다. 즉 숫자를 x로부터 추출한다. 여기서 찾는 건 int가 아니라 str형식이라는 걸 유념해야 한다.
Greedy, Non-greedy
Greedy는 욕심쟁이라는 뜻처럼, str중 조건에 해당하는 가장 큰 문자열을 취하려고 한다.
Non-greedy는 반대로 가장 작은 문자열을 취하려고 한다. 예를 들면
x = 'From: Using the : character'
#y는 greedy, z는 non-greedy
y = re.findall('^F.+', x)
z = re.findall('^F.+?:', x)
print(y)
print(z)
>>> From: Using the :
>>> From:
위와 같은 식으로 표현된다. 또
x = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
>>> y = re.findall('\S+@\S+', x)
>>> z = re.findall('\S+?@\S+?', x)
>>> print(y)
>>> print(z)
stephen.marquard@uct.ac.za
d@u
위와 같은 형태가 될 수 있다.
(괄호)의 사용
추출을 좀 더 정확하게 tuning하는 과정에서 괄호를 사용할 수 있다. 예를 들어
>>> y = re.findall('^From (\S+@\S)', x)
['stephen.marquard@uct.ac.za']
위와 같은 형식인데, txt파일로부터 From으로 시작하며 '한개 이상의 non-whitespace'@'한개 이상의 non-whitespace'로 이루어진 문자열을 찾아내고, 그 중에서 괄호 안에 있는 내용('한개 이상의 non-whitespace'@'한개 이상의 non-whitespace')만을 추출하는 것이다.
실제로 !@#$%^&()등을 찾고 싶은 경우에는?
str에서 실제로 $가 포함된 단어를 찾고 싶다면 앞에 백슬래쉬(\)를 입력한다. 그렇게 되면 정규식이 아닌 str으로 인식해서 불러오게 된다.