본문 바로가기
삽질/Python

[ Python 삽질 ] 파이썬 정규표현식 re.sub 을 이용해서 대문자 소문자 바꾸기

by SteadyForDeep 2021. 8. 3.
반응형

 

// 문제 상황

 

re 패키지를 쓰면 누구나 쉽게(?) 정규표현식을 이용하여 문자열 다룰 수 있다.

 

하지만 파이썬에서 re를 잘 쓰다가 보면 이상하게

 

대소문자를 바꿔주는 메타문자를 사용할 수가 없다.

 

예컨데 bbc_ads 라는 문자의 _a 를 A로 바꿔야 한다고 할때 골치 아파진다.

 

stackoverflow 에 보면 원래는 일반적인 regex를 사용한다고 할때

 

import re

string = "bbc_ads"
new_str = re.sub(
	"(_)([a-z])",
    "\u$2",
    string
)

print(new_str)
>>> "bbcAds"

 

이렇게 \u 를 이용하여서 처리할 수 있다고 한다.

 

하지만 파이썬에서는 \u를 사용하면 유니코드 인코딩을 의미하는 것이기 때문에 ecape되고 만다.

 

이런 충돌로 인하여 파이썬에서는 \u는 물론이고 \U와 \N 등의 페턴을 지원하지 않는다.

 

 

파이썬의 공식 docs에서 보면 \u와 \U는 오로지 유니코드 패턴으로만 인식된다고 한다...

 

그래서 그런지 \l, \L 도 안먹힌다. 

 

 

// 해결방안

 

위의 예시에 대하여는 아래의 코드를 사용하면 된다.

 

import re

string = "bbc_ads"
new_str = re.sub(
	"(_)([a-z])",
    lambda x : x.group(2).upper(),
    string
)

 

// 설명

 

이렇게 하면 우선 페턴을 서치하여 re의 Match object가 생기는데 이 객체 안에는

 

1. (_) 에 매치되는 그룹이 하나 생기고

2. ([a-z]) 에 매치되는 그룹이 하나 생긴다.

 

따라서 각각 찾아진 Match 에서 2번째 그룹의 upper()를 반환하는 lambda 함수를 넣어주면

 

내가 원하는 알파벳을 swapcase 하여 반환할 수 있다.

 

문자열 처리를 할때 인코딩과 디코딩을 아직도 잘 모르고

 

개념을 못 잡았는데 그것때문에 항상 regex에서 발목이 잡힌다.

 

언제한번 날잡고 정리를 해야겠다.

 

https://docs.python.org/3/library/re.html#match-objects

 

re — Regular expression operations — Python 3.9.6 documentation

This module provides regular expression matching operations similar to those found in Perl. Both patterns and strings to be searched can be Unicode strings (str) as well as 8-bit strings (bytes). However, Unicode strings and 8-bit strings cannot be mixed:

docs.python.org

위 링크로 가면 re가 동작할때 어떻게 매치된 문자열들을 다루는지 좀 더 상세하게 나와있다.

 

반응형

댓글