Omi*_*mid 6 python regex unicode
我应该编写一个小程序,它接受波斯语文本,并在某些地方将空格更改为半空格。在某些语言中,使用半空格或零宽度非连接符来避免在规范化文本时出现连字。据推测,它的 unicode 字符\'\\u200c\'
在某些文本编辑器中可以通过 SHIFT+SPACE 显示在屏幕上:
import re\ntxt = input(\'Please enter a Persian text: \')\noriginal_pattern = r\'\\b(\\w+)\\s*(\xd9\x87\xd8\xa7|\xd9\x87\xd8\xa7\xd9\x8a\xd9\x8a|\xd9\x87\xd8\xa7\xd9\x8a\xd9\x85|\xd9\x87\xd8\xa7\xd9\x8a)\\b\'\nnew_pattern = r\'\\1 \\2\'\nnew_txt = re.sub (original_pattern, new_pattern, txt)\nprint (new_txt) \n
Run Code Online (Sandbox Code Playgroud)\n\n在上面的代码中,new_pattern
应该在\\1
和之间引入一个半空格\\2
,目前它们之间有一个空格。
问题是:如何在那里放置半个空格?我尝试了以下方法,在这两种情况下都出现语法错误:
\n\nnew_pattern = ur\'\\1\\u200c\\2\' \n\nnew_pattern = r\'\\1\\u200c\\2\'\n
Run Code Online (Sandbox Code Playgroud)\n\n顺便说一句,虽然在 Wikipedia 文章中,ZWNJ 的 unicode 字符被指定为 U+200c,但它在 python shell 中似乎并没有以这种方式工作,而且实际上将空间加倍:
\n\n>>> print (\'He is a\',u\'\\u200c\',\'boy\')\nHe is a \xe2\x80\x8c boy\n\n>>> print ("\xda\xa9\xd8\xaa\xd8\xa7\xd8\xa8",u"\\u200c","\xd9\x87\xd8\xa7")\n\xda\xa9\xd8\xaa\xd8\xa7\xd8\xa8 \xe2\x80\x8c \xd9\x87\xd8\xa7\n\n>>> print ("\xda\xa9\xd8\xaa\xd8\xa7\xd8\xa8 \xd9\x87\xd8\xa7")\n\xda\xa9\xd8\xaa\xd8\xa7\xd8\xa8 \xd9\x87\xd8\xa7\n>>> \n
Run Code Online (Sandbox Code Playgroud)\n
Python为 print 函数的参数添加了一个分隔符,你可以用sep
argument来控制它,试试
print ('He is a', '\u200c', 'boy', sep="")
Run Code Online (Sandbox Code Playgroud)
对于模式,尝试
new_pattern = '\\1\u200c\\2'
Run Code Online (Sandbox Code Playgroud)
或者
new_pattern = '\\1\N{ZERO WIDTH NON-JOINER}\\2'
Run Code Online (Sandbox Code Playgroud)
原因是,当您添加r
前缀时,转义符\
将被忽略,因此 \u200c
模式的一部分受到 5 个字符字符串的威胁,即模式 equals \\1\\u200c\\2
,因此您的错误。