이스케이프 문자 & 정규 표현식

yeoni·2023년 5월 8일
1
post-custom-banner

이스케이프 문자

  • 이스케이프 문자: \(백슬래시, 키보드에서 Enter 키 위 키) 와 바로 뒤에 같이 나오는 특정 문자(r, n, t 등)를 합쳐진 특별한 문자

  • \n, \r : 줄 바꿈

    • \n: 라인 피드, 유닉스 (맥) 운영 체제에서의 줄 바꿈 표현
    • \r\n: 캐리지 리턴(종이 오른쪽으로 밀기) + 라인 피드(종이 위로 밀기), 윈도우즈 운영 체제에서의 줄 바꿈 표현
  • \t : 탭 (키보드에서 Tab 키)

  • \' : ' (홑따옴표)

  • \" : " (쌍따옴표)

  • \\ : \ (백슬래시) 자체를 표시

  • r'문자열': 이스케이프 문자의 의미 무시, 그대로 출력, raw string

정규표현식 기초

  • 메타 문자: 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자
    . ^ $ * + ? { } [ ] \ | ( )
  • +, *, [], {} 등의 메타문자는 매치가 진행될 때 현재 매치되고 있는 문자열의 위치가 변경된다.

문자 클래스 [ ]

  • 문자 클래스로 만들어진 정규식은 "[ ] 사이의 문자들과 매치"라는 의미를 갖는다.
  • [ ] 안의 두 문자 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위(From - To)를 의미한다. 예를 들어 [a-c]라는 정규 표현식은 [abc]와 동일하고 [0-5]는 [012345]와 동일하다.
  • 주의: 문자 클래스 안에 ^ 메타 문자를 사용할 경우에는 반대(not)라는 의미를 갖는다. 예를 들어 [^0-9]라는 정규 표현식은 숫자가 아닌 문자만 매치된다.

자주 사용하는 정규식

\d - 숫자와 매치, [0-9]와 동일한 표현식이다.
\D - 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.
\s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.
\S - whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.
\w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다.
\W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다.

Dot(.)

  • Dot(.) 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.
    a.b : "a + 모든문자 + b"
    a[.]b : "a + Dot(.)문자 + b"

반복 (*)

  • '*' 반복 횟수 0부터 가능
    ca*t : 바로 앞에 있는 문자 a가 0부터 무한대로 반복될 수 있다는 의미(메모리 제한으로 2억 개 정도만 가능)
    (ct, cat, caaat → 다 매치)

반복 (+)

  • '+'는 최소 1번 이상 반복될 때 사용한다.
    ca+t : "c + a(1번 이상 반복) + t"
    (ct → 매치 x , cat & caat → 매치)

반복 ({m,n}, ?)

1. {m}

ca{2}t : "c + a(반드시 2번 반복) + t"

2. {m, n}

ca{2,5}t : "c + a(2~5회 반복) + t"

3. ?

ab?c : "a + b(있어도 되고 없어도 된다) + c"

정규표현식 심화

  • 문자열 소비가 없는(zerowidth assertions) 메타 문자에 대해 살펴보기

'|

  • | 메타 문자는 or과 동일한 의미로 사용된다.
    A|B : A 또는 B

'^'

  • ^ 메타 문자는 문자열의 맨 처음과 일치함을 의미
>>> print(re.search('^Life', 'My Life'))
None

'$'

  • $ 메타 문자는 문자열의 끝과 매치함을 의미
  • ^ 또는 $ 문자를 메타 문자가 아닌 문자 그 자체로 매치하고 싶은 경우에는\^, \$ 로 사용하면 된다.
>>> print(re.search('short$', 'Life is too short, you need python'))
None

\A

  • \A는 문자열의 처음과 매치됨을 의미
  • re.MULTILINE 옵션을 사용할 경우 ^은 각 줄의 문자열의 처음과 매치되지만 \A는 줄과 상관없이 전체 문자열의 처음하고만 매치된다.

\Z

  • \Z는 문자열의 끝과 매치됨을 의미
  • re.MULTILINE 옵션을 사용할 경우 $ 메타 문자와는 달리 전체 문자열의 끝과 매치된다.

\b

  • \b는 단어 구분자(Word boundary)이다. 보통 단어는 whitespace에 의해 구분된다.
  • \b 메타 문자를 사용할 때 주의해야 할 점이 있다. \b는 파이썬 리터럴 규칙에 의하면 백스페이스(BackSpace)를 의미하므로 백스페이스가 아닌 단어 구분자임을 알려 주기 위해 r'\bclass\b'처럼 Raw string임을 알려주는 기호 r을 반드시 붙여 주어야 한다.

\B

  • \B 메타 문자는 whitespace로 구분된 단어가 아닌 경우에만 매치된다.
  • class 단어의 앞뒤에 whitespace가 하나라도 있는 경우에는 매치가 안된다.
>>> p = re.compile(r'\Bclass\B')
>>> print(p.search('the declassified algorithm'))
<re.Match object; span=(6, 11), match='class'>
>>> print(p.search('one subclass is'))
None

정규 표현식을 지원하는 re 모듈

  • re(regular expression의 약어) 모듈

정규식을 이용한 문자열 검색

  • match, search는 정규식과 매치될 때는 match 객체를 리턴하고, 매치되지 않을 때는 None을 리턴한다.
  • finditer는 findall과 동일하지만 그 결과로 반복 가능한 객체(iterator object)를 리턴한다. 그리고 반복 가능한 객체가 포함하는 각각의 요소는 match 객체이다.
Method목적
match()문자열의 처음부터 정규식과 매치되는지 조사한다.
search()문자열 전체를 검색하여 정규식과 매치되는지 조사한다.
findall()정규식과 매치되는 모든 문자열(substring)을 리스트로 리턴한다.
finditer()정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 리턴한다.

match 객체의 메서드

Method목적
group()매치된 문자열을 리턴한다.
start()매치된 문자열의 시작 위치를 리턴한다.
end()매치된 문자열의 끝 위치를 리턴한다.
span()매치된 문자열의 (시작, 끝)에 해당하는 튜플을 리턴한다.

compile option

  • re.DOTALL or re.S - . 이 줄바꿈 문자를 포함하여 모든 문자와 매치할 수 있도록 한다.
  • re.IGNORECASE or re.I - 대소문자에 관계없이 매치할 수 있도록 한다.
  • re.MULTILINE or re.M - 여러줄과 매치할 수 있도록 한다. (^, $ 메타문자의 사용과 관계가 있는 옵션이다)
  • re.VERBOSE or re.X - verbose 모드를 사용할 수 있도록 한다. (정규식을 보기 편하게 만들수 있고 주석등을 사용할 수 있게된다.)

백슬래시 문제

"\section" 문자열을 찾기 위한 정규식을 만든다고 가정

1) \section: \s로 인해 whitespace 문자와 매치 - [ \t\n\r\f\v]ection
2) \\section 이스케이프 처리하지만 파이썬 정규식 엔진(정규식을 해석하고 수행하는 모듈)에는 파이썬 문자열 리터럴 규칙에 따라 \\\로 변경되어 \section이 전달 → Raw String로 해결

# Raw String 사용
>>> p = re.compile(r'\\section')

Reference
1) https://wikidocs.net/16475
2) https://wikidocs.net/4308

profile
데이터 사이언스 / just do it
post-custom-banner

0개의 댓글