与区域指示符字符类匹配的python正则表达式 [英] A python regex that matches the regional indicator character class
问题描述
我在Mac上使用的是python2.7.10。 表情符号中的标志用一对Regional Indicator Symbols表示。我想编写一个python正则表达式来在一串emoji标志之间插入空格。
例如,此字符串是两个巴西国旗:
u"U0001F1E7U0001F1F7U0001F1E7U0001F1F7"
将呈现如下:🇧🇷🇧🇷
我想在任何一对区域指示器符号之间插入空格。大概是这样的:
re.sub(re.compile(u"([U0001F1E6-U0001F1FF][U0001F1E6-U0001F1FF])"),
r"1 ",
u"U0001F1E7U0001F1F7U0001F1E7U0001F1F7")
...这将导致:
u"U0001F1E7U0001F1F7 U0001F1E7U0001F1F7 "
...但该代码给我一个错误:
sre_constants.error: bad character range
提示(我认为)哪里出了问题,这表明U0001F1E7在regex中变成了两个字符:
re.search(re.compile(u"([U0001F1E7])"),
u"U0001F1E7U0001F1F7U0001F1E7U0001F1F7").group(0)
这将导致:
u'ud83c'
遗憾的是,我对Unicode的理解太弱,无法取得进一步的进步。
推荐答案
我相信你在Windows或Mac上使用的是Python2.7,它有窄的16位Unicode版本-Linux/Glibc通常有32位完整的Unicode,而且Python3.5在所有平台上都有宽的Unicode。
您看到的是被拆分成代理项对的代码。不幸的是,这也意味着您不能轻松地使用单个字符类来执行此任务。然而,这仍然是有可能的。U+1F1E6 (🇦)的UTF-16表示为uD83CuDDE6
,U+1F1FF (🇿)为uD83CuDDFF
。
我甚至根本无法访问此类Python版本,但您可以尝试
uD83C[uDDE6-uDDFF]
作为单个[U0001F1E6-U0001F1FF]
的替代,因此您的整个正则表达式将
(uD83C[uDDE6-uDDFF]uD83C[uDDE6-uDDFF])
Character类不起作用的原因是它尝试设置从第一个代理项对的后半部分到第二个代理项对的前半部分的范围-这失败了,因为范围的开始在词典顺序上大于结束。
但是,此正则表达式在Linux上仍然不起作用,您需要使用那里的原始表达式,因为Linux版本默认使用宽Unicode。
或者,将您的Windows Python升级到3.5或更高版本。
这篇关于与区域指示符字符类匹配的python正则表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!