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

问题描述:

表情符号中的标志由一对Regional Indicator Symbols指示。我想编写一个python正则表达式来在一串表情符号标志之间插入空格。匹配区域指示符字符类的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。

+2

它给了我这个:''在python 3.5.1第一次尝试。 – Psidom

+0

此代码在arch linux上的python2.7中可用。 –

我相信你在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上工作,您需要在那里使用原始表达式。或者升级到Python 3.5。