正则表达式中的半空间

时间:2013-11-30 21:55:22

标签: python regex unicode

我应该编写一个接受波斯文本的小程序,并在某些地方将空间更改为半空格。在对文本进行规范化时,在某些语言中使用半空格或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'

顺便说一下,虽然在维基百科的文章中,ZWNJ的unicode字符是以U + 200c的形式给出的,但它似乎并没有在python shell中那样工作,它实际上是在空间上加倍:

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

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

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

1 个答案:

答案 0 :(得分:4)

Python为print函数的参数添加了一个分隔符,您可以使用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因此你的错误。