【问题标题】:Python emoji search and replace not working as expectedPython 表情符号搜索和替换无法按预期工作
【发布时间】:2017-05-21 19:13:25
【问题描述】:

我正在尝试将给定文本中的表情符号与其他字符/单词/表情符号分开。我想稍后将表情符号用作文本分类中的特征。因此,重要的是我将句子中的每个表情符号单独视为一个单独的字符。

代码:

import re

text = "I am very #happy man but???????? my wife???? is not ????????"
print(text) #line a

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

#padding the emoji with space at both the ends
new_text = reg.sub(' \1 ',text) 
print(new_text) #line b

# this is just to test if it can still identify the emoji in new_text
new_text2 = reg.sub('#\1#', new_text) 
print(new_text2) # line c

这是实际输出:

(我不得不粘贴屏幕截图,因为从终端复制粘贴输出会扭曲 b 和 c 行中那些已经扭曲的表情符号)

这是我的预期输出:

I am very #happy man but???????? my wife???? is not ????????
I am very #happy man but ????  ????  my wife ????  is not  ????  ???? 
I am very #happy man but #????#  #????#  my wife #????#  is not  #????#  #????# 

问题:

1) 为什么搜索和替换没有按预期工作?替换的表情符号是什么? (b 行)。它绝对不是原始表情符号的 unicode,否则 c 行会打印出两端带有 # 填充的表情符号。

2) 我不确定我是否正确,但是 - 为什么将分组的表情符号替换为单个表情符号/unicode? (b行)

【问题讨论】:

  • 你期待这个 - rextester.com/UXJ28002 吗?我发现您的预期输出与我在解决最明显的问题后得到的不同。
  • 我希望每个表情符号都分开。请参阅预期输出中的第二个问题和第三行。不知道为什么分组的表情符号没有分开。
  • 我认为这是因为您量化了字符类,请参阅rextester.com/RXOBH48259。现在,它看起来像您预期的输出。
  • 这似乎行得通。您能否将其添加为答案并简要说明我哪里出错了?我还不擅长 python/regex。

标签: python regex string emoji


【解决方案1】:

这里有几个问题。

  • 在正则表达式模式中没有捕获组,但在替换模式中,您将 \1 反向引用定义为组 1 - 因此,最自然的解决方法是使用对组 0 的反向引用,即整个匹配,即是\g<0>
  • 替换中的\1 实际上并未解析为反向引用,而是解析为八进制值为 1 的字符,因为常规(非原始)字符串文字中的反斜杠构成转义序列。这里是八进制转义。
  • ] 后面的+ 表示正则表达式引擎必须匹配匹配字符类的文本的 1 次或多次出现,因此您匹配表情符号的序列,而不是每个单独的表情符号。

使用

import re

text = "I am very #happy man but?? my wife? is not ??"
print(text) #line a

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> ',text) 
print(new_text) #line b

# this is just to test if it can still identify the emojis in new_text
new_text2 = reg.sub(r'#\g<0>#', new_text) 
print(new_text2) # line c

查看Python demo打印

I am very #happy man but?? my wife? is not ??
I am very #happy man but ?  ?  my wife ?  is not  ?  ? 
I am very #happy man but #?#  #?#  my wife #?#  is not  #?#  #?# 

【讨论】:

  • 非常感谢。学到了一些新东西。
  • 很多人更喜欢可读性而不是效率,所以你也可以用()包装整个模式,然后使用你的\1,但总是使用原始字符串文字,即r" \1 "
  • 当然。再次感谢。正则表达式很复杂。我不知道我是否会掌握它们。 :)
猜你喜欢
  • 2023-04-03
  • 2020-06-15
  • 1970-01-01
  • 2016-11-12
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
相关资源
最近更新 更多