现实需求
在我的文本格式化工程
中,需要将“女中豪杰”替换成为女中豪杰
。
需要将全角双引号
替换成为半角反引号
或者markdown的高亮语法,进行行内高亮。
具体来说,像是如下图所示的情况:
在这个场景中,需要额外考虑的一点是,需要和对话场景中的双引号区分开。
我使用的正则表达式是:
(?<![:])[“]([\u4e00-\u9fa5]+?)[”]
那么我就可以将匹配到的字符串进行替换了。
我随便写个例子测试一下。
import re
text = "潘金莲真是“女中豪杰”,西门庆仰慕不已。潘金莲说:“大官人。”"
pattern = r'(?<![:])[“]([\u4e00-\u9fa5]+?)[”]'
new_text = re.sub(pattern, r'==\1==', text)
print(new_text)
# 输出
# 潘金莲真是==女中豪杰==,西门庆仰慕不已。潘金莲说:“大官人。”
很成功的。
附录:汉字Unicode范围
要包含最常用的汉字、扩展A汉字区块、扩展B汉字区块和扩展C汉字区块,也就是全部的汉字范围,你可以使用以下的Unicode范围:
\u4e00-\u9fff
:基本汉字区块\u3400-\u4dbf
:扩展A汉字区块\u20000-\u2a6df
:扩展B汉字区块\u2a700-\u2b73f
:扩展C汉字区块
将这些范围组合起来,将会覆盖几乎所有的汉字字符
。
在正则表达式中,可以这样表示:
[\u4e00-\u9fff\u3400-\u4dbf\u20000-\u2a6df\u2a700-\u2b73f]
也可以使用(这个比较常用)
[\u4e00-\u9fa5]
附录:中文汉字和标点的Unicode范围
中文标点Unicode范围
中文标点通常位于不同的Unicode范围内,
例如常见的中文标点如逗号、句号、括号等位于\u3000-\u303F
范围内,这个范围被称为CJK符号和标点
。
还有一些其他的Unicode范围也包含了中文标点,如\uff00-\uffef(半角标点)
和\u3040-\u309F
(日语中的Katakana字符
,其中也包含了一些常用的中文标点
)。
什么是CJK
CJK是中日韩统一表意文字的缩写,
全称为“中日韩统一表意文字(CJK Unified Ideographs)”。
这个术语是用来描述一个字符集
,
该字符集合并了来自中文(Chinese)、日文(Japanese)和韩文(Korean)的表意文字。
这些文字本质上是相同的或形状相似,具有相同的意义
。
CJK字符集的目标是统一这些来自不同语言的表意文字,并为它们在计算机编码中提供一个统一的编码标准。
在Unicode标准中,这些文字被赋予了相同的编码,使得它们可以在全球范围内被一致地处理和显示。
此外,CJK也可以指代LaTeX中的一个宏包
,
它用于支持中日韩三国文字在LaTeX文档中的排版和显示。
在这个宏包中,定义了一个连续的区域,从0x4E00
到0x9FA5
,
包含了20902个来自中国(包括台湾)、日本和韩国的汉字。
在Unicode中,CJK字符集的范围主要分布在多个区段中。
最常用的范围是U+4E00到U+9FA5,
这个范围被称为“CJK Unified Ideographs”,
即中日韩统一表意文字。
这个区段内包含了大约20,902个汉字,涵盖了中日韩三国的常用汉字。
然而,需要注意的是,Unicode中的CJK字符集并不仅限于这个范围。
除了基本的汉字区块外,Unicode还定义了其他几个与CJK相关的区块,
如扩展A汉字区块(U+3400-U+4DBF)、
扩展B汉字区块(U+20000-U+2A6DF)和扩展C汉字区块(U+2A700-U+2B73F)。
这些区块也包含了大量的汉字字符,尤其是生僻字
和异体字
。
因此,如果要包括所有的CJK字符,不仅仅是常用的汉字,还需要考虑这些扩展区块
。
但在很多应用场景中,基本的汉字区块(U+4E00-U+9FA5)已经足够满足需求了
。