[Python] 정규 표현식 (Regular Expressions)

2024. 10. 29. 18:32·Python

 

메타 문자

정규 표현식에서는 다음과 같은 메타 문자를 이용하여 특별한 의미를 나타낸다

. ^ $ * + ? { } [ ] \ | ( )

 

(1) [ ] : 괄호 안의 문자 중 하나

예) [abc]

"a" : a가 있으므로 매치된다

"before" : b가 있으므로 매치된다

"dude" : a, b, c 중 어느 하나도 포함하지 않으므로 매치되지 않는다

 

[] 안의 두 문자 사이에 -를 사용하면 두 문자 사이의 범위를 나타낸다

[a-zA-Z] : 모든 알파벳

[0-9] : 모든 숫자 

 

^를 사용할 경우 반대라는 의미이다

[^0-9] : 숫자가 아닌 문자만 매치된다

 

자주 사용되는 문자 클래스

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

대문자로 사용된 것은 소문자의 반대임을 추측할 수 있다.

 

 

(2) .

a.b : a 하나 b 하나 사이에 어떤 문자가 들어와도 매치 된다

 

(3) *

* 앞에 있는 문자가 0번부터 무한대까지 반복 될 수 있음을 나타낸다

ca*t : ct, cat, caat, caaaat, caaaaaaat

 

(4) +

+ 앞에 있는 문자가 1번부터 무한대까지 반복 될 수 있음을 나타낸다

ca+t : cat, caat, caaat

 

(5) {}

ca{2}t : a를 반드시 2번 반복, caat

ca{2,5}t : a를 2~5회 반복, caat, caaat, caaaat, caaaaat

 

(6) ?

{0,1}과 같다, 한 개 있어도 되고, 없어도 된다는 의미

 

(7) |

or을 의미한다

여러 개의 정규 표현식 중 맞는 하나의 패턴을 찾고 싶을 때 이용할 수 있다

import re

regex = r"[a-z]\?[A-Z]|[A-Z]\![a-z]"
s1 = "asdfads?ADSFADF"
s2 = "ADFASD!dasda"

m1 = re.search(regex, s1)
m2 = re.search(regex, s2)

print(m1.group())
print(m2.group())

 

re 모듈

파이썬은 정규 표현식을 제공하기 위해 파이썬 설치 시 자동으로 설치되는 re모듈을 제공한다

import re
p = re.compile(r'[a-z]+')

# 여기서 p는 패턴(정규식을 컴파일한 결과물)을 의미
# 정규식을 컴파일해서 객체를 생성한다


# (1) match : 문자열의 처음부터 정규식과 매치되는지 검사
m = p.match("python")
print(m) 
# 매치 객체가 리턴됨
# m.group() : 매치된 문자열을 돌려준다
# m.start() : 매치된 문자열의 시작 위치를 돌려준다
# m.end() : 매치된 문자열의 끝 위치를 알려준다
# m.span() : 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 돌려준다


# (2) search : 문자열 전체를 검색하여 정규식과 매치되는지 검사
# 처음부터 하는 것이 아니라 전체를 스캔하기 때문에 처음에는 만족 안해도 뒤에서 만족하면 검색됨


# (3) findall : 문자열에서 패턴과 매치되는 모든 값을 찾아 리스트로 리턴
result = p.findall("life is too short")
print(result)  
# ['life','is','too','short']


# (4) finditer : findall과 동일하지만 리스트가 아니라 반복 객체를 리턴한다

 

>>> p = re.compile('[a-z]+')

>>> m = p.match("python")

 

위 두 줄의 코드를 다음과 같이 축약하여 사용할 수 있다

>>> m = re.match("[a-z]+", "python")

 

 

역슬래시 문제

\section
# \s가 whitespace로 해석되어 의도한 대로 매치가 이루어지지 않음

# 위 표현과 다음 표현은 완전히 동일한 의미를 나타낸다
[ \t\n\r\f\v]ection

# 의도한 대로 표현하고 싶으면 다음과 같이 작성해야 한다
\\section
# 근데 이렇게 작성하면, 파이썬 리터럴 규칙에 따라 \\를 \로 받아들이게 되어서
# \section이 전달된다

# 정규식 표현 앞에 r를 붙여주면 raw string 규칙이 적용되어서 
# escape 문자를 인식하지 않는 문자열로 만들어 줄 수 있다

 

 

그룹 이름 지정(Named Capture Group)

정규 표현식에서 ?P<name>을 원하는 패턴 앞에 써주면, 특정 표현식에 대해서 이름으로 그룹을 지정할 수 있다

 

import re

string = "a1b2c3?w1adffwea2b3c5?sfwaef"
m = re.search(r"(?P<first>[a-z]\d)(?P<second>[a-z]\d)", string)
print(m['first'])
print(m['second'])

#a1
#b2

 

 

 

'Python' 카테고리의 다른 글
  • [Python] join 메소드 ☑️
  • [Python] 나눗셈 오차를 없애는 방법 ☑️
  • [Python] 런타임 에러 (RecursionError) 해결법 ☑️
  • [Python] 문자열이 숫자인지 확인하는 방법 ☑️
vysryoo
vysryoo
  • vysryoo
    vysryoo
    vysryoo
  • 전체
    오늘
    어제
    • 분류 전체보기 (129)
      • Python (20)
      • Data structure (12)
      • Algorithm (14)
      • Operating system (18)
      • Programming language theory (12)
      • Computer architecture (6)
      • Softeware engineering (8)
      • Multicore (2)
      • Data Base (3)
      • Problem solving (24)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
vysryoo
[Python] 정규 표현식 (Regular Expressions)
상단으로

티스토리툴바