与区域指示符字符类匹配的python正则表达式

本教程将介绍与区域指示符字符类匹配的python正则表达式的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

与区域指示符字符类匹配的python正则表达式 教程 第1张

问题描述

我在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正则表达式的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。