Python 정규식에서 특수 문자 이스케이프
특수 문자가 그 자체를 나타내도록 만들어야 한다고 가정해 봅시다. 이를 위해 백슬래시를 사용하여 이스케이프해야 합니다. 예제를 통해 살펴보겠습니다.
예제
다음 예제에서 정규식 작성자는 검색 패턴이 다음과 같기를 원했습니다: 문자
'a', 그 다음 플러스 '+', 그 다음 문자 'x'. 그러나 코드 작성자는
기호 '+'를 이스케이프하지 않았기 때문에 실제 검색 패턴은 다음과 같습니다:
문자 'a'가 한 번 이상 나온 후, 문자 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
코드 실행 결과:
'a+x ! ! !'
예제
이제 작성자가 플러스를 백슬래시로 이스케이프했습니다. 이제 검색 패턴은
원하는 대로 보입니다: 문자 'a', 그 다음 플러스 '+', 그 다음 문자
'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
코드 실행 결과:
'! ax aax aaax'
예제
이 예제에서 패턴은 다음과 같습니다:
문자 'a', 그 다음 점 '.', 그 다음 문자 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
코드 실행 결과:
'! abx azx'
예제
다음 예제에서 작성자는 슬래시를 이스케이프하는 것을 잊었고, 이스케이프되지 않은 점은 어떤 문자든 나타낼 수 있기 때문에 정규식은 모든 부분 문자열과 일치하게 되었습니다:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
코드 실행 결과:
'! ! !'
참고
점이 그 자체를 나타내야 할 때 역슬래시를 잊어버리면 - 이를 알아차리지 못할 수도 있습니다:
res = re.sub('a.x', '!', 'a.x')
print(res) # '!'를 반환하며, 우리가 원했던 대로입니다.
시각적으로는 올바르게 작동합니다 (점이 모든 문자를 나타낼 수 있으며, 일반 점 '.'도 포함하기 때문입니다). 하지만 대체가 발생하는 문자열을 변경하면 우리의 실수를 보게 될 것입니다:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # '! ! !'를 반환하지만, '! abx azx'가 예상됩니다.
특수 문자와 일반 문자 목록
일반 문자를 이스케이프해도 아무 일도 일어나지 않습니다 - 여전히 그 자체를 나타냅니다. 예외는 숫자이며, 숫자는 이스케이프할 수 없습니다.
종종 특정 문자가 특수 문자인지 아닌지 의심스러울 때가 있습니다. 어떤 사람들은 의심스러운 모든 문자를 무차별적으로 이스케이프하기도 합니다. 그러나 이는 좋지 않은 습관입니다 (정규식을 백슬래시로 지저분하게 만듭니다).
특수 문자: $ ^ . * + ? \ / {} [] () |
특수 문자가 아님: @ : , ' " - _ = < > % # ~ `& !
실습 문제
다음 문자열이 주어졌습니다:
txt = 'a.a aba aea'
문자열 'a.a'를 찾고 나머지는 찾지 않는 정규식을 작성하세요.
다음 문자열이 주어졌습니다:
txt = '2+3 223 2223'
문자열 '2+3'를 찾고 나머지는 찾지 않는 정규식을 작성하세요.
다음 문자열이 주어졌습니다:
txt = '23 2+3 2++3 2+++3 345 567'
문자열 '2+3', '2++3', '2+++3'를 찾고 나머지는 찾지 않는 정규식을 작성하세요 (+는 임의의 개수일 수 있습니다).
다음 문자열이 주어졌습니다:
txt = '23 2+3 2++3 2+++3 445 677'
문자열 '23', '2+3', '2++3', '2+++3'를 찾고 나머지는 찾지 않는 정규식을 작성하세요.
다음 문자열이 주어졌습니다:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
문자열 '*q+', '*qq+', '*qqq+'를 찾고 나머지는 찾지 않는 정규식을 작성하세요.
다음 문자열이 주어졌습니다:
txt = '[abc] {abc} abc (abc) [abc]'
대괄호 안의 문자열을 찾아 '!'로 바꾸는 정규식을 작성하세요.