본문 바로가기

파이썬

파이썬 정규표현식

    • 문자 클래스 [ ] : [ ] 사이의 문자들과 매치
      • [a-zA-Z] : 알파벳 모두
      • [0-9] : 숫자
      • \\d -  [0-9]와 동일
      • \\D - 숫자가 아닌 것, [^0-9]와 동일
      • \\s - whitespace 문자와 매치
      • \\S - whitespace 문자가 아닌 것과 매치
      • \\w - 문자+숫자 [a-zA-Z0-9_]와 동일
      • \\W - 문자+숫자(alphanumeric)가 아닌 문자,  [^a-zA-Z0-9_]와 동일. 특수문자 축약
    • Dot(.) : 줄바꿈 문자인 \\n 을 제외한 모든 문자와 매치, 자리를 맡아둠 (re.DOTALL 옵션을 주면 \\n 문자와도 매치된다.)
    • $ : end$ ⇒ end로 끝나는 문자열과 매칭
    • | : a(b**|**c) ⇒ a 그리고 b 또는 c 를 포함한 문자열과 매칭 ( a[bc] 와 같음)
    • Caret(^) : 문자열의 제일 앞 부분과 일치함을 의미. ⇒ “[^ ]”과는 다르니 주의한다.
    • 반복
      • () :** 바로 앞에 있는 문자가 0부터 무한대로 반복
        • a**(bc)* :** a 그리고 0개 이상의 bc 를 포함한 문자열과 매칭
      • (+) : +는 최소 1번 이상 반복될 때
      • {m, n} : ca{2,5}t ⇒ "c + a(2~5회 반복) + t”, [a]{2,}이면 a가 2개 이상인거 [a]{2, 4}이면 aa, aaa, aaaa 이다.
      • ? : ab?c ⇒ "a + b(있어도 되고 없어도 된다) + c”정규표현식 (import re 필요)
        사용 예시 : test_0001.txt 처럼 특정한 이름 지정 규칙을 따랐는데, 이 파일들만을 반환하고 싶으면, ^(test.+)\.txt$
    • re.sub(정규 표현식, 대상 문자열 , 치환 문자)
        • 정규 표현식 - 검색 패턴을 지정
        • 대상 문자열 - 검색 대상이 되는 문자열
        • 치환 문자 - 변경하고 싶은 문자
    • 참고1 | 이름짓기 (?P<이름> 정규표현식>)
    • 참고2 | 정규패턴식 앞에 r이 붙어 있는 경우, 파이썬 정규식에는 Raw string이라고 한다. 컴파일 해야 하는 정규식이 Raw String(순수한 문자)임을 알려주는 것이다. 
      ex. os.chdir(r"C:\Users\") # r 의미 : 역슬래시를 이스케이프 문으로 인식하지 않고 주소로 인식

참조 문서 : https://wikidocs.net/4308

 

07-2 정규 표현식 시작하기

[TOC] ## 정규 표현식의 기초, 메타 문자 정규 표현식에서 사용하는 메타 문자(meta characters)에는 다음과 같은 것이 있다. > ※ 메타 문자란 원래 ...

wikidocs.net

 

정규표현식을 처음 공부해 봤는데, 생각보다 응용하기 쉽지 않네요. 

그렇지만, 확실히 복잡한 반복문 없이 문제를 해결할 수 있는 좋은 방법인 것 같습니다.

코딩도장에 있는 문제 중에 정규표현식으로 문제를 해결한 경우와 그렇지 않은 경우를 비교해 보았습니다.

문제: DashInsert 함수는 숫자로 구성된 문자열을 입력받은 뒤, 문자열 내에서 홀수가 연속되면 두 수 사이에 - 를 추가하고, 짝수가 연속되면 * 를 추가하는 기능을 갖고 있다. (예, 454 => 454, 4546793 => 454*67-9-3) DashInsert 함수를 완성하자

1.  반복문을 사용한 경우
def DashInsert(ui):
    result = "%s" % ui[0]
    for i in range(len(ui)-1):
        if int(ui[i])%2 == 0 and int(ui[i+1])%2 == 0:
            result += '*'
        elif int(ui[i])%2 == 1 and int(ui[i+1])%2 == 1:
            result += '-'
        result += ui[i+1]
    return result

ui = input("숫자로 구성된 문자열 입력>> ")
print(DashInsert(ui))​
2. 정규 표현식
import re
print(re.sub(r'(([02468]{2,})|([13579]{2,}))', lambda x:'*'.join(x.group(2)) if x.group(2) else '-'.join(x.group(3)), input(":")))​

 

https://codingdojang.com/scode/529?answer_mode=hide

 

코딩도장

프로그래밍 문제풀이를 통해서 코딩 실력을 수련

codingdojang.com

점프 투 파이썬에 있는 내용도 응용해서 사용하려면 오래 걸릴 것 같네요 ㅠㅠ

 

'파이썬' 카테고리의 다른 글

복소수  (0) 2022.08.17
++, --, +=,-=,*= 그리고 a,b = b,a (swap)  (0) 2022.08.09
파이썬 클래스  (0) 2022.08.06
파이썬 print 함수 응용(sep, end,\n,f-string)  (0) 2022.07.27
리스트 표현식(List Comprehension)  (0) 2022.07.26