2016-07-31 2 views
2

이모티콘을 모두 ''으로 바꾸고 싶지만 내 regEx가 작동하지 않습니다. 예를 들어
,python-re.sub() 및 유니 코드

content= u'?\u86cb\u767d12\U0001f633\uff0c\u4f53\u6e29\u65e9\u6668\u6b63\u5e38\uff0c\u5348\u540e\u665a\u95f4\u53d1\u70ed\uff0c\u6211\u73b0\u5728\u8be5\u548b\U0001f633?' 

내가 ''\U0001f633 같은 모든 형태를 바꾸려는 그래서 코드 쓰기 :

print re.sub(ur'\\U[0-9a-fA-F]{8}','',content)

을하지만 그것은 작동하지 않습니다.
고마워요.

답변

3

제대로 디코드 한 유니 코드 코드 포인트 (\uXXXX 등이 포함 된 문자열)를 올바르게 인식 할 수 없습니다. 정규식 파서가 도착할 때까지 올바르게 * 디코딩됩니다. 파이썬은 16 비트 유니 코드 코드 포인트 여부를 컴파일되었는지 여부에 따라

, 당신은 같은 패턴 무언가를 할 것 중 하나

# 16-bit codepoints 
re_strip = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') 

# 32-bit* codepoints 
re_strip = re.compile(u'[\U00010000-\U0010FFFF]') 

그리고 당신의 코드는 같을 것이다 :

import re 

# Pick a pattern, adjust as necessary 
#re_strip = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') 
re_strip = re.compile(u'[\U00010000-\U0010FFFF]') 

content= u'[\u86cb\u767d12\U0001f633\uff0c\u4f53\u6e29\u65e9\u6668\u6b63\u5e38\uff0c\u5348\u540e\u665a\u95f4\u53d1\u70ed\uff0c\u6211\u73b0\u5728\u8be5\u548b\U0001f633]' 
print(content) 

stripped = re_strip.sub('', content) 
print(stripped) 

두 표현은, 당신이 후했던 이모티콘을 제거 (26)

이 표현에 BU를 stripped 문자열에있는 문자의 수를 감소 다른 물건도 벗겨 낼 수도 있습니다 do want. 유니 코드 코드 포인트 범위 목록 (예 : here)을 검토하고 조정할 가치가 있습니다.

당신은 당신의 파이썬은 같은 것을 수행하여 16 비트 코드 포인트를 인식 설치 여부를 확인할 수 있습니다

import sys 
print(sys.maxunicode.bit_length()) 

를이 (16)를 표시하는 경우, 첫 번째 정규식 표현을해야합니다. 16보다 큰 값을 표시하면 (나에게 21이라고 말함) 두 번째 것은 원하는 것입니다.

파이썬 설치에서 잘못된 sys.maxunicode을 사용하면 두 표현식 모두 작동하지 않습니다.

다음을 참조하십시오 : this related.

+0

대단히 감사합니다. 그것은 작동합니다. 하지만 당신은 내가 원하는 다른 것들도 제거 할 수 있다고 말합니다. 그렇다면 이모티콘 만 제거하려면 어떻게해야합니까? 내용에는 한자, 숫자, 글자, 구두점 및 그림이 포함될 수 있습니다. BTW, 내 파이썬은 16 비트 유니 코드 코드 포인트로 컴파일됩니다. – sophiaCY

+0

음, * may *. 내가 "필터링하는"코드 포인트는 10000 [여기] (http://jrgraphix.net/research/unicode_blocks.php)부터 시작합니다. 그래서 "선형 B 음절"의 "태그"를 통한 모든 것. 내 경험상, 대부분의 글꼴에는 해당 코드 포인트에 대한 글리프가 없습니다. 그래서 당신이 원하는 모든 것이 그 범위에있을 것 같지 않으므로 필터링은 괜찮을 지 모르지만, 알고 있어야 할 것입니다. – jedwards