본문 바로가기
정규표현식

[ python ] 정규표현식[1]

by fiasco 2022. 10. 27.
Mastering Python Regular Expressions

http://www.packtpub.com/


Authors : Félix López 

제1장  Introducing Regular Expressions

 

정규식은 텍스트 문자열이 가져야 하는 형식을 정의하는 텍스트 패턴입니다. 

이를 사용하여 다음 활동을 수행할  있습니다.

      Check -     입력이 주어진 패턴을 따르는지 확인합니다.

                         예를 들어, 입력한 값이 HTML formulary 맞는 유효한 이메일 주소인지 확인

      Search -    텍스트에서 패턴 모양을 찾습니다.

                         예를 들어  번의 스캔으로 문서에 "color" 또는 "colour"이라는 단어가 나타나는지 확인

      Extract -    텍스트의 특정 부분을 추출합니다. 예를 들어 주소의 우편번호를 추출

      Replace - 텍스트의 일부를 교체합니다. 예를 들어 "color" 또는 "colour" "red"으로 변경합

      Split -       , 쉼표 또는 개행 문자의 모양에 따라 텍스트 분할과 같이  텍스트를 작은 조각으로 분할

The regular expression syntax

 

 표현식에서 literal (a) metacharacter (\w  *)  가지 구성 요소를 찾을  있습니다. 정규식은 일반 문자(: 문자 a~z 또는 숫자 0~9) 메타 문자로 알려진 특수 문자로 구성된 텍스트 패턴입니다.  패턴은 텍스트에 적용될  일치하는 문자열을 설명합니다.

Literals

리터럴은 정규식에서 가장 간단한 패턴 일치 형식입니다. 그 리터럴이 발견될 때마다 그들은 단순히 성공할 것입니다.

메타 문자를 리터럴처럼 사용할 수 있습니다.

  • 메타 문자 앞에 백슬래시(\)를 붙여 escape한다.

           ※ 정규표현식에는 문자 그대로의 의미로 사용되는 경우 이스케이프해야 하는 12개의 메타 문자가 있습니다.   

  • 정규표현식의 non-alphanumeric characters를(특히 메타문자)를 escape처리하여 일반 문자화 한다.  
      >>> re.findall(re.escape("^"), "^like^")      # 정규표현식의 string을 문자화 - > "\^" 의미
      ['^', '^']

Characte classescharacter sets ) : [ 허용된 문자 ]

set에 정의된 문자가 있는 경우 일치하는 문자 하나를 정의

  • 캐릭터의 범위 이용 : -
    예, [a-z] , [A-Z], [0-9], [0-9a-zA-Z]
  • set 부정 이용 : [^ 
    예, [^0-9], [^0-9a-zA-Z]
    ※ /hello[^0-9e]/와 /hello/는 불일치 - hello로 뒤에 꼭 하나의 문자 있어야 한다.

미리 정의된 문자 클래스

미리 정의된 문자 클래스 사용하면 표현식을  읽기 쉽게 만듭니다

Python이 지원하는 미리 정의된 문자 클래스:

※  These characters match a different set of characters depending on the configured locale and the support of Unicode.

Alternation : I (pipe symbol)

집합의 or 기능

※ 일반 문자보다 우선 순위가 낮다.(마지막 순위)

/yes|no/     yes, no
/Licence: (yes|no)/ Licence: yes, Licence: no

Quantifiers

문자, 메타 문자 ,캐릭터 클래스, 그룹이 반복될 수 있는 방법을 정의하는 메커니즘

 quantifier(수량자)는 선행 문자 전체가 아닌 항상 앞 토큰(token)에만 적용된다.
                                                                                      ? = {,1} ,  * =  {0,} ,  + =  {1,}

/\d+[-\s]?\d+[-\s]?\d+/                       555-555-555, 555 555 555, 555555555.

/ \ d{1,3}[- \ s]?\ d{3}[- \ s]?\ d{3}/     위의 정규식에 숫자의 반복횟수만 제한

Greedy and reluctant quantifiers

greedy quantifier      - 가능한  가장  일치 결과를 얻기 위해 최대한 일치시키려고 quantifier를 반복. 예, /".*"/

reluctant quantifier   - 탐욕스럽지 않은 행동은 quantifier에 ?를 추가하여 가장 작은 일치  결과를 얻으려 반복한다.

                                      reluctant quantifier는 greedy 정반대로 행동. 예를 들어, ??, *? 또는 +?

Boundary Matchers

text단위가 아닌 전체 라인, input에 대한 메커니즘

※ flag, locale에 따라 결과가 달라진다.

     ※ ^, $는 문자열에서 볼 수도 없고 문자열에 쓸 수도 없다, 그러나 regex engine에서는 항상 존재하며 유효한 문자이다. 

/^Name:/ "Name: John", "Name:Yonghee"
/^Name:[\sa-zA-Z]+$/ "Name: John"(o), "Name:Yong125hee"(x)
/\bhello\b/ "hello"(o), helloed(x), Othello(x)

메타 문자 요약

1) 매치가 진행될 때 현재 매치되고 있는 문자열의 위치가 변경되는 메타문자(소비된다) 

2) 문자열을 소비시키지 않는 메타 문자 (zerowidth assertions)

'정규표현식' 카테고리의 다른 글

[ Python ] 정규표현식 Table 및 우선순위  (0) 2022.11.01
[ python ] 정규표현식[5]  (0) 2022.10.31
[ python ] 정규표현식[4]  (0) 2022.10.30
[ Python ] 정규표현식[3]  (0) 2022.10.27
[ python ] 정규표현식[2]  (0) 2022.10.27