Regular Expression [Chapter 11]

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으로 인식해서 불러오게 된다.