【问题标题】:Match unicode emoji in python regex在 python 正则表达式中匹配 unicode 表情符号
【发布时间】:2017-01-24 23:19:57
【问题描述】:

我需要提取文本中数字和表情符号之间的文本

示例文本:

blah xzuyguhbc ibcbb bqw 2 extract1  ☺️ jbjhcb 6 extract2 ???? bjvcvvv

输出:

extract1
extract2

我编写的正则表达式代码提取了 2 个数字之间的文本,我需要更改它识别 unicode 表情符号字符的部分并提取它们之间的文本。

(?<=[\s][\d])(.*?)(?=[\d])

请建议一种对 python 友好的方法,我需要它来处理所有表情符号,而不仅仅是示例中给出的那个

https://regex101.com/r/uT1fM0/1

【问题讨论】:

  • 您应该查看此堆栈以获取表情符号的正则表达式stackoverflow.com/q/28077049/4639336
  • @reticentroot 我认为它不适用于像“????”这样的 utf8 表情符号。
  • @reticentroot 我需要它来处理 unicode 表情符号。
  • 在匹配表情符号之前,您可以先将Unicode表情符号转换为文本吗?这个帖子stackoverflow.com/questions/25707222/… 就是这样做的。

标签: python regex unicode emoji


【解决方案1】:

所以这可能会或不会取决于您的需要。如果您提前知道表情符号,尽管这可能会起作用,您只需要一个预期的表情符号类型列表。

无论如何,如果没有更多信息,这就是我要做的。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

my_regex = re.compile(r'\d\s*([^☺️|^?]+)')

string = "blah xzuyguhbc ibcbb bqw 2 extract1  ☺️ jbjhcb 6 extract2 ? bjvcvvv"

m = my_regex.findall(string)
if m:
  print m

【讨论】:

  • 然后你需要一个工作列表,每个表情符号的模式是不同的,就像说我需要匹配英语中的每个单词,我需要一个正则表达式来做到这一点。否则想想另一种模式,也许你知道数字后面总是一个单词,那么你可以说得到数字后面的下一个单词而不关心表情符号。
【解决方案2】:

这是我的解决方案。不确定它是否适用于所有情况。诀窍是将所有 unicode 表情符号转换为普通文本。这可以通过关注this post 来完成,然后您可以像匹配任何普通文本一样匹配表情符号。请注意,如果 literal 字符串 \u\U 在您的搜索文本中,它将不起作用。

示例:将您的字符串复制到一个文件中,我们称之为emo。 在终端:

Chip chip@ 03:24:33@ ~: cat emo | python stackoverflow.py
blah xzuyguhbc ibcbb bqw 2 extract1  \u263a\ufe0f jbjhcb 6 extract2 \U0001f645 bjvcvvv\n
------------------------
[' extract1  ', ' extract2 ']

stackoverflow.py 文件在哪里:

import fileinput
a = fileinput.input();
for line in a:
    teststring = unicode(line,'utf-8')
    teststring = teststring.encode('unicode-escape')

import re
print teststring
print "------------------------"
m = re.findall('(?<=[\s][\d])(.*?)(?=\\\\[uU])', teststring)
print m

【讨论】:

    【解决方案3】:

    由于有很多表情符号with different unicode values,您必须在您的正则表达式中明确指定它们,或者如果它们具有特定范围,您可以使用字符类。在这种情况下,您的第二个 simbol 不是标准表情符号,它只是一个 unicode 字符,但由于它大于 \u263a(☺️ 的 unicode 表示),您可以将其放在 \u263a 的范围内:

    In [71]: s = 'blah xzuyguhbc ibcbb bqw 2 extract1  ☺️ jbjhcb 6 extract2 ? bjvcvvv'
    
    In [72]: regex = re.compile(r'\d+(.*?)(?:\u263a|\U0001f645)')
    
    In [74]: regex.findall(s)
    Out[74]: [' extract1  ', ' extract2 ']
    

    或者,如果您想匹配更多表情符号,您可以使用字符范围(这里有一个很好的参考,它向您展示了不同表情符号的正确范围http://apps.timwhitlock.info/emoji/tables/unicode):

    In [75]: regex = re.compile(r'\d+(.*?)[\u263a-\U0001f645]')
    
    In [76]: regex.findall(s)
    Out[76]: [' extract1  ', ' extract2 ']
    

    请注意,在第二种情况下,您必须确保上述范围内的所有字符都是您想要的表情符号。

    这是另一个例子:

    In [77]: s = "blah 4 xzuyguhbc ? ibcbb bqw 2 extract1  ☺️ jbjhcb 6 extract2 ? bjvcvvv"
    
    In [78]: regex = re.compile(r'\d+(.*?)[\u263a-\U0001f645]')
    
    In [79]: regex.findall(s)
    Out[79]: [' xzuyguhbc ', ' extract1  ', ' extract2 ']
    

    【讨论】:

    • 我需要它来处理所有表情符号,而不仅仅是示例中给出的表情符号
    • @LeDerp 正如我所提到的,在这种情况下,您必须使用字符范围。
    猜你喜欢
    • 2014-04-11
    • 2013-01-09
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2021-10-16
    • 1970-01-01
    • 2010-12-22
    相关资源
    最近更新 更多