【问题标题】:Half-space in regex正则表达式中的半空格
【发布时间】:2013-12-16 20:26:04
【问题描述】:

我应该写一个小程序,接收波斯文本,并在某些地方将空格更改为半空格。在某些语言中使用半空格或 zero-width non-joiner 来避免在规范化文本时使用 ligature。它的 unicode 字符应该是 '\u200c',在某些文本编辑器中,它可以通过 SHIFT+SPACE 显示在屏幕上:

import re
txt  = input('Please enter a Persian text: ')
original_pattern = r'\b(\w+)\s*(ها|هايي|هايم|هاي)\b'
new_pattern = r'\1 \2'
new_txt = re.sub (original_pattern, new_pattern, txt)
print (new_txt) 

在上面的代码中,new_pattern 应该在\1\2 之间引入一个半空格,目前它们之间有一个空格。

问题是:我怎样才能在那里放置一个半空格?我尝试了以下方法,在这两种情况下都出现了语法错误:

new_pattern = ur'\1\u200c\2'   

new_pattern = r'\1\u200c\2'

顺便说一句,虽然在 Wikipedia 文章中 ZWNJ 的 unicode 字符被指定为 U+200c,但它在 python shell 中似乎并没有以这种方式工作,它实际上使空间加倍:

>>> print ('He is a',u'\u200c','boy')
He is a ‌ boy

>>> print ("کتاب",u"\u200c","ها")
کتاب ‌ ها

>>> print ("کتاب ها")
کتاب ها
>>> 

【问题讨论】:

  • 什么版本的 Python? 2.x 还是 3.x?

标签: python regex unicode


【解决方案1】:

Python为打印函数的参数添加了分隔符,你可以用sep argument控制,试试

print ('He is a', '\u200c', 'boy', sep="")

对于一个模式,试试

new_pattern = '\\1\u200c\\2'

new_pattern = '\\1\N{ZERO WIDTH NON-JOINER}\\2'

原因是当您添加r 前缀时,转义\ 将被忽略,因此\u200c 部分模式被威胁为5 个字符字符串,即模式等于\\1\\u200c\\2,因此您的错误。

【讨论】:

    猜你喜欢
    • 2020-04-19
    • 2011-08-10
    • 2012-02-02
    • 2016-08-18
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多