![]() |
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 classes( character 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 |