DevOps

[핵심] 정규 표현식- 파이썬에서 정규 표현식 이용하기

IT오이시이 2023. 8. 20. 18:14
728x90

[핵심] 정규 표현식- 파이썬에서 정규 표현식 이용하기

 

[핵심] 정규 표현식
1. 파이썬에서 정규 표현식 이용하기
2. PHP에서 정규표현식 (한글 처리)

 

 

1. 정규식(정규표현식, Regular Expression)이란 ?

정규식은 일반적으로 regex 로 알려져 있습니다 .정규식은 1950년대로 거슬러 올라가는 역사를 가지고 있지만, 1990년대 Perl 프로그래밍 언어에 의해 대중화되었습니다. 주로 Perl, Java, JavaScript, Python, PHP등 과 같은 프로그래밍 언어에서 텍스트를 다루는데 사용하고 있습니다.
정규식은 특정 문자열에서 정의되는 검색 패턴으로 복잡한 검색 문자열, 부분 일치 및 와일드카드, 대소문자를 구분하지 않는 검색 및 기타 고급 명령을 포함하여 텍스트 검색을 위한 인라인 프로그래밍 언어입니다.

정규식을 활용하는 목적은 크게 3가지 입니다.
1) 문자열에서 특정 문자형태가 있는지 확인한다.
2) 문자열에서 특정 문자열을 찾아 변수로 추출한다.
3) 특정 문자열을 다른 문자열로 대체 한다.

예를 들어 특정 문자열에 포함된 전화번호, 주민번호, 이름, 이메일 주소 등과 같은 문자열이 있는지 찾거나, 각 시스템의 로그를 읽고 특정 형태별로 잘라내어 변수에 매핑할 수가 있습니다.
이러한 부분에 대한 예시적인 부분들에 대한 정규표현식의 사용 방법을 알아 보고자 합니다.
 

2. 파이썬에서 정규 표현식 사용

파이썬에서 정규표현식을 사용하기 위해서는 Regex를 위한 모듈인 re 모듈을 사용합니다. re 모듈의 compile 함수는 정규식 패턴을 입력으로 받아들여 정규식 객체를 리턴합니다. re.compile('검색 대상 문자열') 함수로 검색 대상 문자열을 입력하고 정규식 객체 (re.RegexObject 클래스 객체)를 통해 정규식을 이용할 수있습니다.
re.RegexObject 클래스는 re.search(pattern), re.match(pattern) ,re.split(pattern) 등과 같이 문자열을 검색, 분리, 대체 하는 다양한 함수들을 제공합니다.

파이썬 Re모듈이 제공하는 Method 기능

- match(), search(), findall(), split(), sub() 등과 같이 다양한 함수를 제공합니다.

구분Method 종류설명
검색



re.match(RE, string)문자열의 시작 부분에서 RE가 일치하는지 판단합니다.
re.search(RE, string)문자열을 읽어 RE가 일치하는 위치를 찾으습니다.
re.findall(RE,string)RE가 일치하는 모든 부분 문자열을 찾아 리스트로 반환합니다.
re. finditer(RE,string)RE가 일치하는 모든 부분 문자열을 찾아 iterators 로 반환합니다
분리re.split(RE, string)문자열을 RE 패턴으로 쪼개어 리스트로 반환 합니다.
대체re.sub(RE, SUB, string)문자열에서 RE 패턴의 문자열을 SUB 문자열로 대체합니다.
* Iterators : https://www.w3schools.com/python/python_iterators.asp

 

import  re

txt =  "무궁화 꽃이 피었다, The Mugunghwa has bloomed."
x = re.search("^무궁화.*bloomed.$", txt)
if x:
    print("YES! We have a match!")
else:
    print("No match")

print(x)

# 결과
<re.Match object; span=(0, 38), match='무궁화 꽃이 피었다. The Mugunghwa has bloomed.'>
# .* : 앞의 문자가 0개 이상 반복

파이썬 Re모듈로 문자열의 인덱스 기능

- 찾는 문자열의 시작위치, 끝 위치, 포함하는 구간의 문자열의 인덱스를 리턴합니다.

Method 종류설명
group()RE와 일치하는 문자열을 반환합니다.
start()일치의 시작 위치를 반환합니다
end()일치의 끝 위치를 반환합니다
span()일치의 (시작, 끝) 위치를 포함하는 튜플을 반환합니다.

 

import re
txt="Isaac Newton, physicist"
m = re.match(r"(\w+) (\w+)", txt)
print("group.all:",    m.group(0) )  # The entire match
print("group.first:",  m.group(1) )  # The first parenthesized subgroup.
print("group.second:", m.group(2) )  # The second parenthesized subgroup.
print("group.multiple:", m.group(1, 2))    # Multiple arguments give us a tuple.

>>>>>>>>>>>>>>>
group.all: Isaac Newton
group.first: Isaac
group.second: Newton
group.multiple: ('Isaac', 'Newton')

 

3. 자주 사용하는 정규식


3.1 정규식 정의 방법

1) 슬래시 와 문장 패턴을 사용
const re = /ab+c/
2) RegExp 생성자 이용
const re = new RegExp( 'ab+c')

3.2 정규식에 사용하는 메타 문자들의 용도

정규식에서 사용하는 메타문자의 종류 : . ^ $ * + ? { } [ ] \ | ( ) 등과 같은 특수 문자들 입니다.
정규식에 포함되는 일부 문자들은 특수한 의미와 기능을 가진 메타 문자 (metacharacters)로 인식합니다. 일반적인 문자로서 인식 하려면 "₩." ₩^ ₩$ 등과 같이 역슬래쉬 다음의 문자는 원래의 문자로 인식을 합니다. 주로 정규식의 메타 문자는 Regular Expression에서 특정 문자의 반복이나 의미를 바꾸어 주도록 처리할 문자 검색과 대체 등에 활용이 됩니다.
`.` :  1개의 문자와 일치, 뉴라인(\n) 을 제외한 모든 문자를 의미
예) .{3} : 아무 문자 3개로 구성된 문자열을 의미 (F15, 0x0 등)

import re
pattern =r"gr.y"
string ="gray"
result = re.match(pattern, string)
print(result)
# <re.Match object; span=(0, 4), match='gray'>

 
`^` : 문자열이나 행의 처음을 의미,  문자열의 시작 패턴을 의미함 
예) ^abc : abc로 시작하는 문자열을 의미 (abcd, abc12 등)

pattern =r"^gr.y"
string ="gray"
result = re.match(pattern, string)

`$` : 문자열을 마지막을 의미하고  종료 문자열의 패턴을 정의함
예) xyz$ : xyz로 종료되어야 함 (123xyz, strxyz 등)

pattern = r"gr.y$"
string = "gray"
result = re.match(pattern, string)

`*` : 앞 패턴이 0개 이상 반복됨을 의미
예) \d* : 숫자가 없거나 하나 이상인 문자열을 의미 

pattern = r"go*gle"
string = "ggle"
result = re.match(pattern, string)

`+` : 앞 패턴이 최소 하나 이상 반복됨
예)  \d+ : 숫자가 하나 이상 반복되는 문자열을 의미\

import re
pattern = r"go+gle"
string = "gogle"
result = re.match(pattern, string)

`?` : 앞 패턴이 없거나 정확히 하나의 문자를 의미함 (Optional 패턴을 정의할 때 사용)
예) \d? : 숫자가 하나 있거나 없어야 함

import re
pattern = r"go?gle"
string = "ggle"
result = re.match(pattern, string)

{n} : {n} 반복횟수가 정확히 n번, 패턴{n} 앞 패턴이 n번만 반복해서 나타나는 경우
예) \d{3} : 숫자가 3개 있어야 함 
{n,} : {n,} 반복횟수가 n번 이상, 패턴{n,} 앞 패턴이 n번 이상 반복해서 나타나는 경우
예) \d{3,} : 숫자가 3개이상 이어야 함
{n,m} :  {m, n} 반복 횟수 지정, 패턴{n, m} 앞 패턴이 최소 n번, 최대 m 번 반복해서 나타나는 경우 (n 또는 m 은 생략 가능)
예) \d{3,5} : 숫자가 3개, 4개 혹은 5개 있어야 함 

import re
pattern =r"go{1,3}gle"
string ="googlegle"
result = re.match (pattern, string)

 
[]: [문자들] 괄호 안의 가능한 문자 들의 집합을 정의함
예)  [Pp]ython : "Python" 혹은 "python"

import re
pattern =r"[abc]de"
pattern = r"[^abc]de"
string ="ade"
result = re.match (pattern, string)

`[^문자들]` :  [문자들] 중에서 제외되는(피해야할) 문자들의 집합을 정의함.
예) [^aeiou] : 소문자 aeiou를 문자를 제외한 문자들 의미함

import re
pattern = r"[^abc]de"
string ="ade"
result = re.match (pattern, string)

() : 괄호안의 문자열을 그룹으로인식함
예)  [(abc)f-z]   :   abcf,  abcx  abcz 등 과 같이 abc로 시작되는 문자열을 표현
`\` :  '\' 뒤에오는 문자를 특수 문자로 인식을 합니다. 
예) \\ 특수문자 '\'     \.  "."
`|` : 두 패턴 중 하나이어야 함 (OR 기능)
예) a | b : a 또는 b 를 나타냄
\A , \Z : \A 는 ^ 와 같고    \Z 는 $ 와 같음 
 

3.3 정규식에서 사용하는 특수 시컨스

정규식의 문자처리를 좀더 쉽게 표현하기 위해서 메타 문자와 달리 역설래시와 알파벳 문자로 구성된 특스 시컨스는 특수한 의미를 부여합니다.
특수 시퀀스는 '\'로 시작하고 숫자(digit) 집합, 글자(letter) 집합 또는 공백이 아닌 모든 것의 집합과 같이 종종 유용한 미리 정의된 문자 집합을 나타냅니다.

\d :
    숫자 0 ~ 9 \d\d\d : 0 ~ 9 범위의 숫자가 3개를 의미 (123, 000 등)
\w :
    문자를 의미 \w\w\w : 문자가 3개를 의미 (xyz, ABC 등)
\s :
    화이트 스페이스를 의미하는데, [\t\n\r\f] 와 동일 \s\s : 화이트 스페이스 문자 2개 의미 (\r\n, \t\t 등)
\d : 
    모든 십진 숫자와 일치합니다; 이것은 클래스 [0-9]와 동등합니다.
\D : 
   모든 비 숫자 문자와 일치합니다; 이것은 클래스 [^0-9]와 동등합니다.
\s : 
   모든 공백 문자와 일치합니다; 이것은 클래스 [ \t\n\r\f\v] 와 동등합니다.
\S :   
    모든 비 공백 문자와 일치합니다; 이것은 클래스 [^ \t\n\r\f\v] 와 동등합니다.
\w :
   모든 영숫자(alphanumeric character)와 일치합니다; 이것은 클래스 [a-zA-Z0-9_]와 동등합니다.
\W : 
   모든 비 영숫자와 일치합니다; 이것은 클래스 [^a-zA-Z0-9_]와 동등합니다.



참고
https://docs.python.org/ko/3/howto/regex.html
 

[핵심] 정규 표현식
1. 파이썬에서 정규 표현식 이용하기
2. PHP에서 정규표현식 (한글 처리)
728x90
반응형