与区域指标字符类

时间:2016-08-23 18:26:36

标签: python regex unicode

表情符号中的标志由一对Regional Indicator Symbols表示。我想写一个python正则表达式在一串表情符号标志之间插入空格。

例如,这个字符串是两个巴西标志:

u"\U0001F1E7\U0001F1F7\U0001F1E7\U0001F1F7"

这将呈现如下:

我想在任何一对区域指标符号之间插入空格。像这样:

re.sub(re.compile(u"([\U0001F1E6-\U0001F1FF][\U0001F1E6-\U0001F1FF])"),
       r"\1 ", 
       u"\U0001F1E7\U0001F1F7\U0001F1E7\U0001F1F7")

哪会导致:

u"\U0001F1E7\U0001F1F7 \U0001F1E7\U0001F1F7 "

但是那段代码给了我一个错误:

sre_constants.error: bad character range

一个提示(我认为)出现了什么问题,以下内容显示\ U0001F1E7在正则表达式中变为两个“字符”:

re.search(re.compile(u"([\U0001F1E7])"),
          u"\U0001F1E7\U0001F1F7\U0001F1E7\U0001F1F7").group(0)

这导致:

u'\ud83c'

可悲的是,我对unicode的理解太弱,无法取得进一步的进展。

编辑:我在Mac上使用python 2.7.10。

1 个答案:

答案 0 :(得分:9)

我相信你在Windows或Mac中使用Python 2.7,它具有狭窄的16位Unicode构建 - Linux / Glibc通常具有32位完整unicode,而且Python 3.5在所有平台上都具有宽泛的Unicode。

你看到的是一个代码被分成一个代理对。不幸的是,这也意味着您无法轻松地使用单个字符类来执行此任务。但仍有可能。 U+1F1E6 ()的UTF-16表示为\uD83C\uDDE6,而U+1F1FF ()的表示为\uD83C\uDDFF

我甚至根本无法访问这样的Python构建,但您可以尝试

\uD83C[\uDDE6-\uDDFF]

作为单[\U0001F1E6-\U0001F1FF]的替代,因此你的整个正则表达式将是

(\uD83C[\uDDE6-\uDDFF]\uD83C[\uDDE6-\uDDFF])

字符类不起作用的原因是它试图从第一个代理对的后半部分到第二个代理对的前半部分进行范围 - 这会失败,因为范围的开始是按字典顺序大于结尾。

但是,这个正则表达式仍然无法在Linux上运行,你需要使用原始表达式,因为Linux版本默认使用宽的unicode。

或者,将Windows Python升级到3.5或更高版本。