기록하는삶

[파이썬/python] 정규표현식을 이용해 괄호와 괄호 안의 내용 삭제하기 본문

AI/파이썬(Python)

[파이썬/python] 정규표현식을 이용해 괄호와 괄호 안의 내용 삭제하기

mingchin 2021. 9. 13. 16:40
728x90
반응형

문자열 데이터를 다루다 보면, 괄호 안에 불필요하게 표기된 정보들을 삭제하고 싶을 때가 있다. 아래 코드는 re 모듈을 이용하여 특정 문자열에서 불필요한 괄호와 괄호 안의 정보들을 삭제할 수 있는 코드다.

import re

pattern = r'\([^)]*\)'
x = '이건 (괄호 안의 불필요한 정보를) 삭제하는 코드다.'

text = re.sub(pattern=pattern, repl='', string= x)
text

text.split()

입력받은 text에서 괄호와 괄호 안의 정보를 제거하며, .split()을 이용해 단어만 모아 리스트로 반환할 수도 있다. 이를 이해하기 위해서는 정규표현식의 일부를 이해해야한다.

r'문자열'

\, (), % 등 문자열에는 예약어로 특정 기능을 수행하는 문자(메타문자 _ meta characters)들이 있다. 예약어를 그 본래 기능이 아닌 문자 그대로 활용하고 싶다면, 문자열 앞에 r''로 표기함으로써 그 뒤에 오는 문자열의 경우 예약어를 무시하고 문자 그대로 해석하겠다고 표현할 수 있다.(raw 문자열)

문자열 치환에 사용되는 함수 re.sub()는 세 개의 parameter를 받는다.

① pattern: 어떤 문자 치환할 것인가

-> 이때 pattern에 정규표현식이 들어갈 수도 있다.

② repl: 어떤 문자 치환할 것인가

-> 이때 repl에 함수가 들어갈 수도 있다.

③ string: 어떤 문자열 적용할 것인가

즉, re.sub() 함수는 ③의 문자열을 받아서 그 중 모든 ①의 문자열을 ②의 문자열로 바꾸어준다.

예시에 있는 r'\([^)]*\)'의 경우 정규표현식이다. 이를 이해하기 위해 몇 가지를 살펴본다.

(다만 위의 코드에서 raw 문자열임을 표기하는 r은 없어도 똑같은 의미다, '\('가 예약어가 아니기 때문이다.)

정규표현식

1) 문자 클래스(character class) []

[]로 감싸진 정규식이 의미하는 것은 '[] 사이의 문자들과의 매칭'이다. 예를 들어,

[a-zA-Z]: 모든 알파벳
[각-힣]: 모든 한글
[0-9]: 모든 숫자

이런 식이다. 추가로 아래와 같은 내용도 있다.

출처 _ 점프 투 파이썬

2) 반복을 의미하는 *, +

*는 문자열 뒤에 위치하여 해당 문자열이 0번 ~ 무한대(약 2억번)까지 반복되는 것과의 매칭이다.

+는 문자열 뒤에 위차하여 해당 문자열이 1번 ~ 무한대(약 2억번)까지 반복되는 것과의 매칭이다.

[a*bcd]: bcd, abcd, aaaaaabcd 등
[a+bcd]: abcd, aaaaaabcd 등

이를 통해 위의 정규표현식을 이해해보면,

\( + [^)] + * + \)

이렇게 네 개로 구분된다.

(1) 앞 뒤의 '\('와 '\)'는 본래 ()가 묶음을 의미하므로, 괄호 ()를 문자 그대로 인식하기 위해 백슬래시(\)로 escaping 한 것이다.

(2) 두 번째의 [^)]는 ')'를 제외한 모든 문자열을 의미한다.

(3) *는 (2)에 표현한 ')'를 제외한 모든 문자열이 반복되는 경우를 말한다.

즉, 위를 토대로 정리하면 () 안에 있는 ')'를 제외한 모든 문자열, "( ')'를 제외한 모든 문자열)"를 말한다.

 

r'\([^)]*\)' = "( ')'를 제외한 모든 문자열)"

따라서 위의 코드를 이용하면 문자열에 불필요하게 포함된 괄호와 그 안의 내용을 모두 repl = ''로 바꿈으로써 삭제할 수 있다.

import re

pattern = '\([^)]*\)'
x = '이건 (괄호 안의 불필요한 정보를) 삭제하는 코드다.'
text = re.sub(pattern=pattern, repl='', string= x)

' '.join(text.split())

위와 같이 결과로 나온 문자열을 단어로 쪼갰다가 다시 띄어쓰기로 합쳐주면, 보기 좋은 문장을 완성할 수도 있다.

728x90
반응형