正则表达式:中文行内引用的精准替换

现实需求

在我的文本格式化工程中,需要将“女中豪杰”替换成为女中豪杰

需要将全角双引号替换成为半角反引号或者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文档中的排版和显示。

在这个宏包中,定义了一个连续的区域,从0x4E000x9FA5

包含了20902个来自中国(包括台湾)、日本和韩国的汉字。


在Unicode中,CJK字符集的范围主要分布在多个区段中。

最常用的范围是U+4E00U+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)已经足够满足需求了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值