将表情符号视为正则表达式中的一个字符
Treat an emoji as one character in a regex
这是一个小例子:
reg = ur"((?P<initial>[+\-])(?P<rest>.+?))$"
(在这两种情况下,文件都有 -*- coding: utf-8 -*-
)
在Python 2:
re.match(reg, u"hello").groupdict()
# => {u'initial': u'\ud83d', u'rest': u'\udc4dhello'}
# unicode why must you do this
然而,在 Python 3 中:
re.match(reg, "hello").groupdict()
# => {'initial': '', 'rest': 'hello'}
以上行为是 100% 完美的,但是切换到 Python 3 目前不是一个选项。将 3 的结果复制到 2 中的最佳方法是什么,它适用于窄和宽 Python 构建?似乎以“\ud83d\udc4d”的格式出现在我面前,这就是使它变得棘手的原因。
在 python 2.7 中有一个选项可以将该 unicode 转换为表情符号:
b = dict['vote'] # assign that unicode value to b
print b.decode('unicode-escape')
我不知道这正是您要找的。但我认为您可以使用它以某种方式解决该问题。
单独使用 u
前缀即可。
在 Python 2.7:
>>> reg = u"((?P<initial>[+\-])(?P<rest>.+?))$"
>>> re.match(reg, u"hello").groupdict()
{'initial': '', 'rest': 'hello'}
这是因为Python2不区分字节和unicode字符串。
请注意,Python 2.7 解释器将字符表示为 4 个字节。要在 Python 3 中获得相同的行为,您必须将 unicode 字符串显式转换为字节对象。
# Python 2.7
>>> s = "hello"
>>> s
'\xf0\x9f\x91\x8dhello'
# Python 3.5
>>> s = "hello"
>>> s
'hello'
因此对于 Python 2,只需使用该字符的十六进制表示作为搜索模式(包括指定长度)即可。
>>> reg = "((?P<initial>[+\-\xf0\x9f\x91\x8d]{4})(?P<rest>.+?))$"
>>> re.match(reg, s).groupdict()
{'initial': '\xf0\x9f\x91\x8d', 'rest': 'hello'}
在 Python 2 窄版中,非 BMP 字符是两个代理代码点,因此您无法在 []
语法中正确使用它们。 u'[]
等同于u'[\ud83d\udc4d]'
,意思是“匹配\ud83d
或\udc4d
之一。Python2.7例子:
>>> u'\U0001f44d' == u'\ud83d\udc4d' == u''
True
>>> re.findall(u'[]',u'')
[u'\ud83d', u'\udc4d']
要同时修复 Python 2 和 3,请匹配 u'
或 [+-]
。 returns Python 2 和 3 中的正确结果:
#coding:utf8
from __future__ import print_function
import re
# Note the 'ur' syntax is an error in Python 3, so properly
# escape backslashes in the regex if needed. In this case,
# the backslash was unnecessary.
reg = u"((?P<initial>|[+-])(?P<rest>.+?))$"
tests = u'hello',u'-hello',u'+hello',u'\hello'
for test in tests:
m = re.match(reg,test)
if m:
print(test,m.groups())
else:
print(test,m)
输出(Python 2.7):
hello (u'\U0001f44dhello', u'\U0001f44d', u'hello')
-hello (u'-hello', u'-', u'hello')
+hello (u'+hello', u'+', u'hello')
\hello None
输出(Python 3.6):
hello ('hello', '', 'hello')
-hello ('-hello', '-', 'hello')
+hello ('+hello', '+', 'hello')
\hello None
这是一个小例子:
reg = ur"((?P<initial>[+\-])(?P<rest>.+?))$"
(在这两种情况下,文件都有 -*- coding: utf-8 -*-
)
在Python 2:
re.match(reg, u"hello").groupdict()
# => {u'initial': u'\ud83d', u'rest': u'\udc4dhello'}
# unicode why must you do this
然而,在 Python 3 中:
re.match(reg, "hello").groupdict()
# => {'initial': '', 'rest': 'hello'}
以上行为是 100% 完美的,但是切换到 Python 3 目前不是一个选项。将 3 的结果复制到 2 中的最佳方法是什么,它适用于窄和宽 Python 构建?似乎以“\ud83d\udc4d”的格式出现在我面前,这就是使它变得棘手的原因。
在 python 2.7 中有一个选项可以将该 unicode 转换为表情符号:
b = dict['vote'] # assign that unicode value to b
print b.decode('unicode-escape')
我不知道这正是您要找的。但我认为您可以使用它以某种方式解决该问题。
单独使用 u
前缀即可。
在 Python 2.7:
>>> reg = u"((?P<initial>[+\-])(?P<rest>.+?))$"
>>> re.match(reg, u"hello").groupdict()
{'initial': '', 'rest': 'hello'}
这是因为Python2不区分字节和unicode字符串。
请注意,Python 2.7 解释器将字符表示为 4 个字节。要在 Python 3 中获得相同的行为,您必须将 unicode 字符串显式转换为字节对象。
# Python 2.7
>>> s = "hello"
>>> s
'\xf0\x9f\x91\x8dhello'
# Python 3.5
>>> s = "hello"
>>> s
'hello'
因此对于 Python 2,只需使用该字符的十六进制表示作为搜索模式(包括指定长度)即可。
>>> reg = "((?P<initial>[+\-\xf0\x9f\x91\x8d]{4})(?P<rest>.+?))$"
>>> re.match(reg, s).groupdict()
{'initial': '\xf0\x9f\x91\x8d', 'rest': 'hello'}
在 Python 2 窄版中,非 BMP 字符是两个代理代码点,因此您无法在 []
语法中正确使用它们。 u'[]
等同于u'[\ud83d\udc4d]'
,意思是“匹配\ud83d
或\udc4d
之一。Python2.7例子:
>>> u'\U0001f44d' == u'\ud83d\udc4d' == u''
True
>>> re.findall(u'[]',u'')
[u'\ud83d', u'\udc4d']
要同时修复 Python 2 和 3,请匹配 u'
或 [+-]
。 returns Python 2 和 3 中的正确结果:
#coding:utf8
from __future__ import print_function
import re
# Note the 'ur' syntax is an error in Python 3, so properly
# escape backslashes in the regex if needed. In this case,
# the backslash was unnecessary.
reg = u"((?P<initial>|[+-])(?P<rest>.+?))$"
tests = u'hello',u'-hello',u'+hello',u'\hello'
for test in tests:
m = re.match(reg,test)
if m:
print(test,m.groups())
else:
print(test,m)
输出(Python 2.7):
hello (u'\U0001f44dhello', u'\U0001f44d', u'hello')
-hello (u'-hello', u'-', u'hello')
+hello (u'+hello', u'+', u'hello')
\hello None
输出(Python 3.6):
hello ('hello', '', 'hello')
-hello ('-hello', '-', 'hello')
+hello ('+hello', '+', 'hello')
\hello None