匹配python正则表达式中的unicode表情符号

时间:2016-09-16 16:38:59

标签: python regex unicode emoji

我需要在文本

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

示例文字:

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

输出:

extract1
extract2

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

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

请建议一个python友好的方法,我需要它与所有的表情符号一起工作不仅是示例中给出的那个

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

3 个答案:

答案 0 :(得分: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 ']

答案 1 :(得分:1)

这是我对解决方案的抨击。不确定它是否适用于所有情况。诀窍是将所有unicode表情符号转换为普通文本。这可以通过以下this post完成。然后您可以像对待任何普通文本一样匹配表情符号。请注意,如果文字字符串\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

答案 2 :(得分:0)

根据您的需要,这可能或不起作用。如果您提前知道表情符号,虽然这可能会有效,但您只需要一个表达类型的表情符号列表。

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

#!/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