保持笑脸/表情,同时使用正则表达式python删除特殊字符

时间:2018-09-18 18:10:06

标签: python regex text special-characters emoticons

我正在使用以下代码来清理文本

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()

如您所见,我正在删除括号和其他特殊字符。现在,我想在文本中保留以下模式,不要删除它们

:),:-),:(和:-(

有人可以帮我吗?

谢谢

1 个答案:

答案 0 :(得分:1)

您应该问自己,什么图案与要“保护”的表情符号中的任何字符相匹配。您可以轻松地看到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(),!?'`])模式与一个笑脸相匹配以进行保护(:-?[()]:相匹配,然后与可选的-相匹配,然后与(或{{1} }),或者将除否定字符类中定义的字符以外的其他任何字符匹配并捕获到组1中。 ) lambda表达式根据组匹配实现自定义替换逻辑:如果第1组匹配,则发生替换,否则将笑脸放回原处。

如果lambda x: " " if x.group(1) else x.group()(?<!:)(?<!:-)后面有(),则:否定性查找将确保不匹配。

注意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) 模式,我们匹配并捕获了笑脸,但随后我们只允许匹配不以笑脸子字符串({{ 1}})。