如何用正则匹配指定ASCII字母的Unicode相似字符?求相关工具
匹配视觉相似Unicode字符的解决方案
Python标准正则库re没有内置类似[\LookLike{n}]的语法,但可以通过第三方库或自定义脚本实现需求,以下是具体方法:
一、用第三方库快速实现
可以使用confusable_homoglyphs库,它专门用于识别和处理视觉相似的Unicode同形字符。
步骤:
- 安装库:
pip install confusable-homoglyphs
- 编写代码实现匹配:
import re import sys from confusable_homoglyphs import confusables sys.stdout.reconfigure(encoding='utf-8') # 获取所有与'n'视觉相似的字符 look_alike_chars = confusables.similar_characters('n') # 构建正则字符集模式 pattern = re.compile(r'[' + ''.join(look_alike_chars) + ']') # 测试匹配结果 for char in look_alike_chars: if pattern.match(char): print(f"Character '{char}' matches the pattern.") else: print(f"Character '{char}' does NOT match the pattern.")
这个库会自动返回所有视觉上与目标字符相似的字符,包括带变音符号的拉丁字符、其他语言的同源视觉字符等。
二、手动生成相似字符列表
如果不想依赖第三方库,可以通过以下方式生成:
1. 利用Unicode属性筛选
通过unicodedata模块,基于字符的分解形式或名称筛选相似字符:
import unicodedata def get_similar_chars(base_char): similar = {base_char} # 遍历常用Unicode范围(可按需扩大) for cp in range(0x0000, 0xFFFF): char = chr(cp) try: # 筛选带变音符号的同基础字符 decomposed = unicodedata.normalize('NFD', char) if base_char in decomposed: similar.add(char) # 筛选名称包含目标字符相关描述的 name = unicodedata.name(char) if 'LATIN SMALL LETTER N' in name: similar.add(char) except ValueError: continue # 手动补充跨语言视觉相似字符(如西里尔字母п、亚美尼亚字母ո) similar.update({'п', 'ո'}) return sorted(similar) # 获取'n'的相似字符列表 look_alike_chars = get_similar_chars('n') print(look_alike_chars)
2. 参考Unicode官方文档
Unicode官方整理了《Confusable Characters》文档,其中列出了常见的视觉相似字符对,你可以根据文档提取对应字符的列表,手动构建正则字符集。
内容的提问来源于stack exchange,提问作者sanitizedUser
相关产品推荐
相关产品推荐

