如何解决使用正则表达式匹配仅繁体中文中出现的字符
\p{Han}
可用于匹配所有汉字(在汉字中),这些汉字混合了简体中文和繁体中文。
是否存在仅与繁体中文唯一字符匹配的正则表达式?换句话说,匹配简体中文之外的所有中文字符。像(?!\p{Hans})\p{Hant}
之类的东西。
此外,理想情况下,如果正则表达式还可以排除日文汉字,韩文汉字,越南文ChữNho和ChữNôm。
解决方法
由于繁体中文字符在Unicode表上不是连续的,因此不幸的是,没有一个简单的正则表达式而不是逐个测试它们,除非正则表达式支持\p{Hant}
和\p{Hans}
之类的东西。 / p>
受^
的{{3}}指向的answer @jdaz
的启发,我使用comment模块编写了Python脚本生成与繁体中文&
中唯一字符匹配的正则表达式:
from typing import List,Tuple
from hanzidentifier import identify,TRADITIONAL
def main():
block = [
*range(0x4E00,0x9FFF + 1),# CJK Unified Ideographs
*range(0x3400,0x4DBF + 1),# CJK Unified Ideographs Extension A
*range(0x20000,0x2A6DF + 1),# CJK Unified Ideographs Extension B
*range(0x2A700,0x2B73F + 1),# CJK Unified Ideographs Extension C
*range(0x2B740,0x2B81F + 1),# CJK Unified Ideographs Extension D
*range(0x2B820,0x2CEAF + 1),# CJK Unified Ideographs Extension E
*range(0x2CEB0,0x2EBEF + 1),# CJK Unified Ideographs Extension F
*range(0x30000,0x3134F + 1),# CJK Unified Ideographs Extension G
*range(0xF900,0xFAFF + 1),# CJK Compatibility Ideographs
*range(0x2F800,0x2FA1F + 1),# CJK Compatibility Ideographs Supplement
]
block.sort()
result: List[Tuple[int,int]] = []
for point in block:
char = chr(point)
identify_result = identify(char)
if identify_result is TRADITIONAL:
# is traditional only,save into the result list
if len(result) > 0 and result[-1][1] + 1 == point:
# the current char is right after the last char,just update the range
result[-1] = (result[-1][0],point)
else:
result.append((point,point))
range_regexes: List[str] = []
# now we have a list of ranges,convert them into a regex
for start,end in result:
if start == end:
range_regexes.append(chr(start))
elif start + 1 == end:
range_regexes.append(chr(start))
range_regexes.append(chr(end))
else:
range_regexes.append(f'{chr(start)}-{chr(end)}')
# join them together and wrap into [] to form a regex set
regex_char_set = ''.join(range_regexes)
print(f'[{regex_char_set}]')
if __name__ == '__main__':
main()
这会生成我在此处发布的Regex:hanzidentifier
(似乎Stack Overflow不喜欢我发布所生成的Regex)
请注意,由于hanzidentifier
使用https://regex101.com/r/FkkHQ1/5,尤其是它没有使用CC-CEDICT的最新版本,因此,肯定不会涵盖某些繁体字,但对于常用字符来说就足够了
日语汉字很大。幸运的是,日本文化厅的CC-CEDICT为list,因此我创建了commonly used Kanjis供程序阅读。排除了常用的汉字之后,我得到了此正则表达式:this text file
不幸的是,我找不到常用的韩文汉字列表。特别是,如今,汉贾很少使用。越南的Ch Nho和Ch N Nom也几乎被消灭了。
脚注:
^
:该答案中的正则表达式与所有简体字都不匹配。要获得匹配所有简体字(包括繁体中文字符)的正则表达式,请将if identify_result is TRADITIONAL
更改为if identify_result is SIMPLIFIED or identify_result is BOTH
,这样我们便得到了正则表达式:https://regex101.com/r/FkkHQ1/7
&
:此脚本不会过滤日语汉字,朝鲜语汉字,越南语ChN Nho或ChữNôm。您必须对其进行修改以排除它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。