Joh*_*ser 5 python regex unicode
表情符号中的标志由一对区域指示符号表示.我想写一个python正则表达式在一串表情符号标志之间插入空格.
例如,这个字符串是两个巴西标志:
u"\U0001F1E7\U0001F1F7\U0001F1E7\U0001F1F7"
Run Code Online (Sandbox Code Playgroud)
这将呈现如下:
我想在任何一对区域指标符号之间插入空格.像这样的东西:
re.sub(re.compile(u"([\U0001F1E6-\U0001F1FF][\U0001F1E6-\U0001F1FF])"),
r"\1 ",
u"\U0001F1E7\U0001F1F7\U0001F1E7\U0001F1F7")
Run Code Online (Sandbox Code Playgroud)
这将导致:
u"\U0001F1E7\U0001F1F7 \U0001F1E7\U0001F1F7 "
Run Code Online (Sandbox Code Playgroud)
但是那段代码给了我一个错误:
sre_constants.error: bad character range
Run Code Online (Sandbox Code Playgroud)
一个提示(我认为)出现了什么问题,以下内容显示\ U0001F1E7在正则表达式中变为两个"字符":
re.search(re.compile(u"([\U0001F1E7])"),
u"\U0001F1E7\U0001F1F7\U0001F1E7\U0001F1F7").group(0)
Run Code Online (Sandbox Code Playgroud)
这导致:
u'\ud83c'
Run Code Online (Sandbox Code Playgroud)
可悲的是,我对unicode的理解太弱,无法取得进一步的进展.
编辑:我在Mac上使用python 2.7.10.
我相信你在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]
Run Code Online (Sandbox Code Playgroud)
作为单身的替代品[\U0001F1E6-\U0001F1FF],因此你的整个正则表达式将是
(\uD83C[\uDDE6-\uDDFF]\uD83C[\uDDE6-\uDDFF])
Run Code Online (Sandbox Code Playgroud)
字符类不起作用的原因是它试图从第一个代理对的后半部分到第二个代理对的前半部分进行范围 - 这会失败,因为范围的开始是按字典顺序大于结束.
但是,这个正则表达式仍然无法在Linux上运行,您需要使用原始表达式,因为Linux构建默认使用宽的unicode.
或者,将Windows Python升级到3.5或更高版本.
| 归档时间: |
|
| 查看次数: |
524 次 |
| 最近记录: |