python - 如何从文本中删除除单词和表情符号之外的所有内容?

标签 python regex string replace emoji

作为文本分类问题的一部分,我正在尝试清理文本数据集。到目前为止,我正在删除除文本以外的所有内容。标点符号、数字、表情符号——一切都被删除了。现在我正在尝试使用表情符号作为功能,因此我想保留文字和表情符号。

首先,我在文本中搜索表情符号并将它们与其他单词/表情符号分开。这是因为每个表情符号都应该单独/分开处理。所以我搜索了一个表情符号并在其两端填充了空格。

但我在弄清楚如何将已知的正则表达式用于单词和表情符号时不知所措。这是我当前的代码:

import re

def clean_text(raw_text):

    padded_emoji_text = pad_emojis(raw_text)
    print("Emoji padded text: " + padded_emoji_text)

    reg = re.compile("[^a-zA-Z]") # line a

    # old regex to remove everything except words  
    letters_only_text = reg.sub(' ', raw_text)
    print("Cleaned text: " + letters_only_text)

    # Code to remove everything except text and emojis
    # How?

def pad_emojis(raw_text):

    print("Original Text: " + raw_text)

    reg = re.compile(u'['
      u'\U0001F300-\U0001F64F'
      u'\U0001F680-\U0001F6FF'
      u'\u2600-\u26FF\u2700-\u27BF]', 
      re.UNICODE)

    #padding the emoji with space at both ends
    new_text = reg.sub(r' \g<0> ',raw_text) 

    return new_text

text = "I am very #happy man! but😘😘 my wife😞 is not 😊😘. 99/33"
clean_text(text)

当前职业:

Original Text: I am very #happy man! but😘😘 my wife😞 is not 😊😘. 99/33
Emoji padded text: I am very #happy man! but 😘  😘  my wife 😞  is not  😊  😘 . 99/33
Cleaned text: I am very  happy man  but   my wife  is not

我要实现的目标:

I am very happy man but 😘  😘  my wife 😞  is not  😊  😘

问题:

1) 如何将表情符号正则表达式与单词正则表达式一起添加到正则表达式编译中? (a 行)

2) 我还能以更好的方式实现我正在寻找的东西吗,即不必编写单独的函数来分隔表情符号并用空格填充它们?我不知何故觉得这是可以避免的。

最佳答案

您可以在 re.sub 中使用单个正则表达式和 lambda 表达式将这两个步骤合并为一个,如下所示:

import re

emoji_pat = '[\U0001F300-\U0001F64F\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]'
shrink_whitespace_reg = re.compile(r'\s{2,}')

def clean_text(raw_text):
    reg = re.compile(r'({})|[^a-zA-Z]'.format(emoji_pat)) # line a
    result = reg.sub(lambda x: ' {} '.format(x.group(1)) if x.group(1) else ' ', raw_text)
    return shrink_whitespace_reg.sub(' ', result)

text = 'I am very #happy man! but😘😘 my wife😞 is not 😊😘. 99/33'
print('Cleaned text: ' + clean_text(text))
# => Cleaned text: I am very happy man but 😘 😘 my wife 😞 is not 😊 😘

参见 Python demo

解释:

  • 第一个正则表达式看起来像 ([\U0001F300-\U0001F64F\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF])|[^A-Za-z] 和将匹配 并将 捕获到组 1 中,一个表情符号或将只匹配除 ASCII 字母以外的任何字符。如果表情符号被捕获(参见 lambda 中的 if x.group(1)),表情符号将被返回,两边都用空格括起来,否则,空格将被用来替换一个非-信
  • \s{2,} 模式将匹配 2 个或更多空格,shr​​ink_whitespace_reg.sub(' ', result) 将用一个空格替换所有这些 block .

关于python - 如何从文本中删除除单词和表情符号之外的所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44101243/

相关文章:

python - 获取错误 python 对象模块 synsets 不工作

php - 从字符串中删除特殊字符

C++ 将文本文件读入结构数据成员

java - 特殊字符串的正则表达式设计

java - 如何在 cucumber 中编写空字符串和非空字符串的正则表达式

string - 处理列表中未定义的条目

python - 如何从背景和文本颜色相似的轮胎等图像中检测文本?

python - 如何使用 Python Azure SDK 和 Graph 修补现有应用程序?

Python 正则表达式将数字与空格匹配

java - java中使用正则表达式获取数据