// 문제 상황
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가 동작할때 어떻게 매치된 문자열들을 다루는지 좀 더 상세하게 나와있다.
'삽질 > Python' 카테고리의 다른 글
[비동기 삽질] 비동기 처리 첫 삽 뜨기 (0) | 2022.06.07 |
---|---|
[ Python 삽질 ] List의 원소가 한번에 다 바뀔때 deep copy? shallow copy? (2) | 2021.06.02 |
[ Python 삽질 ] __call__() got an unexpected keyword argument 해결법 (0) | 2020.12.29 |
댓글