IT/언어

[python] 문자열에서 특정(일부) 문자만 삭제하는 방법들

개발자 두더지 2021. 11. 17. 20:44
728x90

 이번 포스팅에서는 python에서 불필요한 물자열을 삭제하는 네 가지 방법에 대해 알아보고자 한다.

- strip 메소드 : 양 끝의 불필요한 문자를 삭제한다.

- replace 메소드 : 지정 문자열을 치환하여 삭제한다.

- translate 메소드 : 여러 개로 지정한 문자열을 한 번에 삭제한다. 

- re.sub 함수 : 복잡한 패턴의 문자열을 치환하여 삭제한다.

  strip메소드는 주의점이 있으므로, 제대로 확인해 둘 필요가 있다. 또한 이 중에서 translate 메소드가 제일 처리 속도가 빠르다. 이제 본격적으로 각각의 특징에 대해 알아보자.

 

 

strip 메소드로 문자열을 삭제하는 방법


strip 메소드에는 세 가지가 있다. 

- strip : 양 끝단의 불필요한 문자열을 삭제

- lstrip : 왼쪽 끝단의 불필요한 문자열을 삭제

- rstip : 오른쪽 끝단의 불필요한 문자열을 삭제

모두 기본 구문과 동일하고 이 기본 구문은 다음과 같다.

문자열.strip(삭제할 문자열)

각각에 대해 구체적으로 살펴보자.

1.1. strip으로 양 끝단의 불필요한 문자열을 삭제

strip()은 문자열의 맨 앞과 맨 끝에 있는 필요없는 문자를 삭제하는 메소드이다.

1.1.1. 간단한 삭제

 다음의 문자열에는 앞 뒤로 불필요한 빈 공백 스페이스가 있다. strip 메소드의 인수를 공백으로하면 이 스페이스를 삭제해준다.

text = "   Hello World   "
text.strip()
'Hello World'

 아래의 예에서는 앞 뒤에 불필요한 "a"가 몇 개 붙어있다. 이것을 삭제하고 싶은 경우는 "삭제할 문자열"에 a를 입력한다.

text = "aaaaaHello Worldaaaaaa"
text.strip("a")
'Hello World'

1.1.2. 앞 뒤의 여러 개의 문자를 지정하여 삭제

 삭제하고 문자가, 다음과 같이 여러 개인 경우 strip메소드에 그만큼의 인수를 추가해주면 그만이다.

text = "......Hello World,,,,,,,,"
text.strip("."",")
'Hello World'
text = "ababHello Worldabca"
text.strip("a""b""c")
'Hello World'

1.1.3. 단어의 삭제

아래와 같이 간단히 단어도 삭제할 수 있다.

text = "wordHello Worldword"
text.strip("word")
'Hello World'

 

1.2. lstrip으로 왼쪽 끝단의 불필요한 문자를 삭제

 lstrip()은 왼쪽 끝단에 있는 불필요한 문자열만을 삭제하는 메소드이다. 다음의 예에서는 앞의 strip()메소드와 달리 왼쪽의 공백 스페이스만 삭제한다.

text = "   Hello World   "
text.lstrip()
'Hello World   '

 다음의 예도 왼쪽은 "a"만을 삭제한다.

text = "aaaaaHello Worldaaaaaa"
text.lstrip("a")
'Hello Worldaaaaaa'

 

 

1.3. rstrip으로 오른쪽 끝단의 불필요한 문자를 삭제

 rstrip()메소드는 오른쪽 끝단의 불필요한 문자만을 삭제한다. 설명은 lstrip()과 동일하므로 생략한다.

text = "   Hello World   "
text.rstrip()
'   Hello World'
text = "aaaaaHello Worldaaaaaa"
text.rstrip("a")
'aaaaaaHello World'

 

1.4.strip계 메소드의 주의점

 strip계 메소드로 단어를 삭제할 때에 주의할 필요가 있다. 예를 보자.

text = "dog.jpeg"
text.strip(".jpeg")
'do'

 이 경우 strip()메소드 문자열의 맨 끝에 이어져 있는 ".", "j", "p", "e", "g"를 모두 삭제해버리고 만다. 따라서 결과는 do만 남게된다.

  다음과 같이 제거하고 싶은 문자열의 연결을 분단시키면 이러한 일은 일어나지 않게 된다.

text = "dog_a.jpeg"
text.strip(".jpeg")
'dog_a'

 

 

2. replace메소드로 지정 문자열을 삭제


 replace메소드는 원래 문자열을 치환하기 위한 메소드이다. 하지만, 이것을 이용해서 문자열을 삭제할 수 있다. replace메소드의 기본 구문은 다음과 같다.

문자열.replace(치환하고 싶은 문자열, 새로운 문자, 치환 횟수)

 다음을 살펴보자.

text = "this is a textabcabcabc"
text.replace("abc", "")
'this is a text '

 오른쪽 끝단의 공백 스페이가 신경쓰이는 경우, 다음과 같이 replace메소드의 뒤에 strip메소드를 연결하는 방법도 있다.

text.replace("abc", "").strip()
'this is a text'

 strip 메소드는 양 끝에 불필요한 문자를 삭제할 수 있으나, replace메소드에서는 다음과 같이 문자열 안에 있는 불필요한 문자를 삭제할 수 있다.

text = "this is a abcabcabc text"
text.replace("abc", "")
'this is a  text'

 replace 메소드를 2회 반복하면, "a"의 뒤에 불필요한 스페이스를 삭제하는 것도 가능하다.

text.replace("abc", "").replace("a ","a")
'this is a text'

 

 

3. translate 메소드로 여러 개의 문자열을 삭제하기


 translate 메소드는 여러 개의 문자열을 한 번에 치환하거나 삭제할 수 있으므로 편리하다. translate메소드 str.maketrans함수와 함께 사용한다.

 다음과 같은 예와 같이 사용할 수 있다.

text ="translate、allows・us・to・delete・multiple・letters。"
table = text.maketrans({
    '、': ' ', #왼쪽은 치환하고 싶은 문자, 오른쪽은 새로운 문자
    '。': '.', #왼쪽은 치환하고 싶은 문자, 오른쪽은 새로운 문자
    '・': ' ', #왼쪽은 치환하고 싶은 문자, 오른쪽은 새로운 문자
})
print(text)
print(text.translate(table))
translate、allows・us・to・delete・multiple・letters。
translate allows us to delete multiple letters.

 수정후와 전을 비교해보면, 한 번에 불필요한 문자가 삭제되거나 치환되었음을 알 수 있다. 맨 처음에는 조금 복잡해보일 수 있지만, 사용할 수 있게 되면 편리하므로 추천한다. 

 

 

4. re.sub함수로 여러 개의 문자열을 삭제


 re모듈의 sub함수도 원래 문자열을 치환할 때에 사용하는 것이 일반적이지만, 문자열을 삭제할 때에도 사용할 수 있다. sub함수의 기본 구문은 다음과 같다.

import re #맨 처음에는 re 모듈을 import한다.
re.sub(치환하고 싶은 문자열(정규표현), 새로운 문자열(정규표현), 대상변수 [,치환횟수])

 이제 예를 살펴보자. 다음의 예에서는 문자열 안의 알파벳을 모두 삭제하고 있다.

import re
text = "abc123def456ghi"
new_text = re.sub(r"[a-z]", "", text)
print(new_text)
123456

 첫 번째 인수(치환하고 싶은 문자열)에 입력되어 있는 「r”[a-z]”」는 소문자의 알파벳 모두를 의미하는 정규표현이다. 「r」은 raw string으로 정규표현시에 입력을 추천하고 있다. 

 두 번째 인수에는 「””」를 입력하고 있다. 쌍따옴표 안에 어떠한 문자열도 입력하고 있지않으므로, 삭제와 동일한 의미가 된다.

 첫 번째 인수(치환하고 싶은 문자열)을 「r”[1-9]”」로 한다면 어떻게 될까? 이것은 정수 모두를 의미하는 정규표현이되므로 이번에는 숫자가 전부 삭제될 것이다.

new_text = re.sub(r'[1-9]', "", text)
print(new_text)
abcdefghi

 

 

5. python의 문자열의 개행, 탭 삭제


 strip계 메소드의 인수를 공백으로 한 경우에는 공백 스페이스뿐만 아니라 탭과 개행도 삭제대상이 된다. 또한, replace메소드로 직접 탭이나 개행을 지정하는 것이 가능하다. 

 다음의 예를 살펴보자.

text = """
abcdef
ghijklm
"""
print(text)
abcdef
ghijklm
print(text.strip())
abcdef
ghijklm
text.replace("\n","")
'abcdefghijklm'

 replace메소드의 경우 개행을 삭제하고 싶을 때 「\n」을 탭을 삭제하고 싶을 때는 「\t」를 입력한다. 그러나, 다음의 코드와 같이 여러 개의 개행 코드가 섞여 있는 경우 주의할 필요가 있다.

''' 개행 코드가 섞여 있어도 한 번에 치환(삭제)할 수 있다. '''
tanka = '안녕하세요\r\n감사합니다\n수고하세요\r\n안녕히가세요\n실례합니다'
print(tanka)

print('\n')  #  ←보기 싶도록 개행을 넣었다.

print(tanka.replace('\r\n', '').replace('\n', ''))
안녕하세요 
감사합니다
수고하세요 
안녕히가세요
실례합니다

안녕하세요감사합니다수고하세요안녕히가세요실례합니다

 이러한 경우 문제없이 실행되지만, replace()를 중첩시 순서를 틀리면 의도하지 않은 출력결과게 된다.

print(tanka.replace('\n', '').replace('\r\n', ''))
안녕히가세요실례합니다

 따라서 개행 코드(예:\n, \t, \r, \r\n등)를 삭제하고 싶은 경우는 replace()에 의한 치환이 아닌, join()과 splitlines()이용하는 방법으로 하자.

''' splitlines()과 join()을 이용하면, 그러한 불안이 없어진다. '''
print(''.join(tanka.splitlines()))
안녕하세요감사합니다수고하세요안녕히가세요실례합니다

참고자료

https://www.headboost.jp/python-delete-strings/

728x90