我正在使用以下代码来清理文本
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()
如您所见,我正在删除括号和其他特殊字符。现在,我想在文本中保留以下模式,不要删除它们
:),:-),:(和:-(
有人可以帮我吗?
谢谢
答案 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}})。