[英]keeping smileys/emoticons while removing special characters using regex python
我正在使用以下代碼來清理我的文本
def clean_str(s):
"""Clean sentence"""
s = re.sub(r"[^A-Za-z0-9(),!?\'\`]", " ", s)
s = re.sub(r"\'s", " \'s", s)
s = re.sub(r"\'ve", " \'ve", s)
s = re.sub(r"n\'t", " n\'t", s)
s = re.sub(r"\'re", " \'re", s)
s = re.sub(r"\'d", " \'d", s)
s = re.sub(r"\'ll", " \'ll", s)
s = re.sub(r",", " , ", s)
s = re.sub(r"!", " ! ", s)
s = re.sub(r"\(", " ", s)
s = re.sub(r"\)", " ", s)
s = re.sub(r"\?", " ? ", s)
s = re.sub(r"\s{2,}", " ", s)
s = re.sub(r'\S*(x{2,}|X{2,})\S*',"xxx", s)
s = re.sub(r'[^\x00-\x7F]+', "", s)
return s.strip()
如您所見,我正在刪除括號和其他特殊字符。 現在,我想在我的文本中保持以下模式完整,而不是刪除它們
:), :-), :( 和 :-(
有人可以幫我嗎?
謝謝,
您應該問自己哪些模式與您要“保護”的表情符號中的任何字符相匹配。 您可以輕松看到r"[^A-Za-z0-9(),!?'`]"
、 r"\\("
和r"\\)"
匹配這些字符。
因此,您可以修復這些模式:
s = re.sub(r":-?[()]|([^A-Za-z0-9(),!?'`])", lambda x: " " if x.group(1) else x.group(), s) # Match smilies and match and capture what you need to replace
s = re.sub(r"(?<!:)(?<!:-)\(", " ", s) # Prepend (?<!:)(?<!:-) lookbehinds
s = re.sub(r"(?<!:)(?<!:-)\)", " ", s) # Prepend (?<!:)(?<!:-) lookbehinds
:-?[()]|([^A-Za-z0-9(),!?'`])
模式匹配一個笑臉來保護( :-?[()]
匹配一個:
,然后是一個可選的-
然后 a (
or )
) or 匹配並捕獲除否定字符類中定義的字符以外的任何字符並將其捕獲到組 1 中。 lambda x: " " if x.group(1) else x.group()
lambda 表達式根據組匹配實現自定義替換邏輯:如果組 1 匹配,則進行替換,否則,笑臉被放回原處曾是。
(?<!:)(?<!:-)
負向后視確保(
和)
不匹配,如果它們以:
或:-
開頭。
注意r'\\S*(x{2,}|X{2,})\\S*'
如果它們粘在xx
或XX
也可以匹配表情符號。 但是,修復這個很棘手,因為:(
如果笑臉不在非空白塊的開頭,則它們可能與\\S*
匹配,因此,您可以使用
s = re.sub(r'(:-[()])|(?:(?!:-?[()])\S)*(?:x{2,}|X{2,})(?:(?!:-?[()])\S)*',"xxx" if x.group(1) else x.group(), s)
策略類似於r":-?[()]|([^A-Za-z0-9(),!?'`])"
模式,我們匹配並捕獲笑臉,但我們只允許匹配這樣的非空白字符( \\S
)不開始笑臉子串( (?:(?!:-?[()])\\S)*
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.