在 python 正则表达式中匹配 unicode 表情符号
Match unicode emoji in python regex
我需要提取文本中数字和表情之间的文字
示例文本:
blah xzuyguhbc ibcbb bqw 2 extract1 ☺️ jbjhcb 6 extract2 bjvcvvv
输出:
extract1
extract2
我写的正则表达式提取了两个数字之间的文本,我需要更改它识别 unicode 表情符号字符的部分并提取它们之间的文本。
(?<=[\s][\d])(.*?)(?=[\d])
请推荐一个 python 友好的方法,我需要它来处理所有表情符号,而不仅仅是示例中给出的表情符号
所以这可能会或不会取决于您的需要。如果您提前知道表情符号,虽然这可能会起作用,但您只需要一个期望的表情符号类型列表。
无论如何,如果没有更多信息,这就是我要做的。
#!/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
这是我的解决方案。不确定它是否适用于所有情况。诀窍是将所有 unicode 表情符号转换为普通文本。这可以通过以下方式完成 this post 然后你可以像匹配任何普通文本一样匹配表情符号。请注意,如果 文字 字符串 \u
或 \U
在您搜索的文本中,它将不起作用。
示例:将您的字符串复制到一个文件中,我们称之为 emo
。
在终端中:
Chip chip@ 03:24:33@ ~: cat emo | python Whosebug.py
blah xzuyguhbc ibcbb bqw 2 extract1 \u263a\ufe0f jbjhcb 6 extract2 \U0001f645 bjvcvvv\n
------------------------
[' extract1 ', ' extract2 ']
其中 Whosebug.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
由于有很多表情符号 with different unicode values,您必须在正则表达式中明确指定它们,或者如果它们具有特定范围,您可以使用字符 class。在这种情况下,您的第二个 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 ']
我需要提取文本中数字和表情之间的文字
示例文本:
blah xzuyguhbc ibcbb bqw 2 extract1 ☺️ jbjhcb 6 extract2 bjvcvvv
输出:
extract1
extract2
我写的正则表达式提取了两个数字之间的文本,我需要更改它识别 unicode 表情符号字符的部分并提取它们之间的文本。
(?<=[\s][\d])(.*?)(?=[\d])
请推荐一个 python 友好的方法,我需要它来处理所有表情符号,而不仅仅是示例中给出的表情符号
所以这可能会或不会取决于您的需要。如果您提前知道表情符号,虽然这可能会起作用,但您只需要一个期望的表情符号类型列表。
无论如何,如果没有更多信息,这就是我要做的。
#!/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
这是我的解决方案。不确定它是否适用于所有情况。诀窍是将所有 unicode 表情符号转换为普通文本。这可以通过以下方式完成 this post 然后你可以像匹配任何普通文本一样匹配表情符号。请注意,如果 文字 字符串 \u
或 \U
在您搜索的文本中,它将不起作用。
示例:将您的字符串复制到一个文件中,我们称之为 emo
。
在终端中:
Chip chip@ 03:24:33@ ~: cat emo | python Whosebug.py
blah xzuyguhbc ibcbb bqw 2 extract1 \u263a\ufe0f jbjhcb 6 extract2 \U0001f645 bjvcvvv\n
------------------------
[' extract1 ', ' extract2 ']
其中 Whosebug.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
由于有很多表情符号 with different unicode values,您必须在正则表达式中明确指定它们,或者如果它们具有特定范围,您可以使用字符 class。在这种情况下,您的第二个 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 ']