프로그래밍 연습하기

Python에서 텍스트 안의 이모지(emoji)제거하기 본문

Python

Python에서 텍스트 안의 이모지(emoji)제거하기

john.k 2019. 4. 6. 12:26
반응형

파이썬으로 텍스트를 처리하던 도중

안에 이모지가 있으면 처리를 못해서 에러가 나는 일이 있었습니다.

 

셀레니움 find_element_by_*****.send_key(text)

에서 text에 이모지가 있을 때 

WebDriverException: unknown error: ChromeDriver only supports characters in the BMP

크롬드라이버에서 지원하지 않는 문자라고 나옵니다.

 

그래서 방법을 찾아보았습니다.

https://stackoverflow.com/questions/33404752/removing-emojis-from-a-string-in-python

 

removing emojis from a string in Python

I found this code in Python for removing emojis but it is not working. Can you help with other codes or fix to this? I have observed all my emjois start with \xf but when I try to search for str.

stackoverflow.com

여기에 나온 방법으로 정규 표현식을 통해 이모지만 제거해 줄 수 있었습니다.

반대로 findall을 사용해서 패턴에 속하는 문자들(이모지)만 얻을 수도 있습니다.

 
#!/usr/bin/env python
import re

text = u'This dog \U0001f602'
print(text) # with emoji

emoji_pattern = re.compile("["
        u"\U0001F600-\U0001F64F"  # emoticons
        u"\U0001F300-\U0001F5FF"  # symbols & pictographs
        u"\U0001F680-\U0001F6FF"  # transport & map symbols
        u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
                           "]+", flags=re.UNICODE)
print(emoji_pattern.sub(r'', text)) # no emoji
print(emoji_pattern.findall(text))  # only emoji

 

이외 다른 방법으로 

def deEmojify(inputString):
    return inputString.encode('ascii', 'ignore').decode('ascii')

이 방법도 있었지만 아무래도 아스키코드로 인코딩을 하다보니 한글 같은 문자도 전부 지워져서 사용하기 힘들 것 같았습니다.

임시방편으로 ascii가 아니라 euc-kr로 바꿔준다면 한글은 지워지지 않는 것을 확인했는데 ,이러다 보면 또 euc-kr에서 지원하지 않는 문자가 지워질 수도 있을 것 같아서 첫번째 방법이 제일 좋다고 생각합니다.

 

 


 

 

이외에도 비슷한 오류가 생겨서 더 알아봤더니...

에러 메세지의 BMP란 유니코드에서 Basic Multilingual Plane(기본 다국어 평면)을 의미합니다.

 

따라서 이모지 뿐만 아니라 BMP영역 이외의 문자의 사용이 불가능하다는 것을 알게 되었습니다.

특정 이모지만 제거하는 것이 아니라 BMP영역 이외 문자를 제거하는 것으로 바꿔야 할 것 같습니다.

0000-FFFF 까지가 BMP이고 10FFFF까지 SMP, SIP, TIP, SSP, PUA 공간이 잡혀있어서

10000-10FFFF까지 제거하는 것으로 코드를 바꿔보았습니다.

 
import re

text = '안녕하세요 반갑습니다🐶'
print(text) 
only_BMP_pattern = re.compile("["
        u"\U00010000-\U0010FFFF"  #BMP characters 이외
                           "]+", flags=re.UNICODE)
print(only_BMP_pattern.sub(r'', text))# BMP characters만

 

이런식으로 수정할 수 있지 않을까 싶습니다.

반응형
Comments