是否存在算法可将英文短语中的直撇号、直引号替换为对应斜向变体?
英文直引号转弯引号的实现方法
是有成熟算法可以完成这个转换的,这类算法通常被叫做「智能引号(Smart Quotes)转换算法」,针对你说的语法正确的英文输入场景,准确率基本可以到99%以上,几乎不会出现误判。
核心判断规则
直双引号 "(U+0022)替换逻辑
- 出现在行首、空白字符之后,或者破折号、左括号这类前置标点之后时,判定为左双引号,替换为
“(U+201C) - 其余场景判定为右双引号,替换为
”(U+201D)
直单引号 '(U+0027)替换逻辑
这个字符会同时用作撇号和包裹用单引号,需要先做场景判断:
- 撇号场景:符合以下任意一种情况时,直接替换为
’(U+2019,Unicode 标准里这个字符同时用作英文撇号):- 出现在两个英文字母中间,比如
don't、I'm - 出现在行首后接字母,是单词缩写场景,比如
'Tis、'em - 出现在数字/单词末尾表所属格,比如
the 90s'、James' bike
- 出现在两个英文字母中间,比如
- 包裹用单引号场景:规则和双引号完全一致:
- 出现在行首、空白字符之后、前置标点之后时,判定为左单引号,替换为
‘(U+2018) - 其余场景判定为右单引号,替换为
’(U+2019)
- 出现在行首、空白字符之后、前置标点之后时,判定为左单引号,替换为
简化实现伪代码
你可以参考下面的逻辑自己实现,也可以直接用各语言现成的第三方库:
def convert_smart_quotes(text: str) -> str: # 引号状态标记,用于嵌套场景校验 single_open = False double_open = False chars = list(text) for i, c in enumerate(chars): prev_char = chars[i-1] if i > 0 else '' next_char = chars[i+1] if i < len(chars)-1 else '' if c == '"': if (prev_char in ('', ' ', '-', '(') or not double_open): chars[i] = '“' double_open = True else: chars[i] = '”' double_open = False elif c == "'": # 先判断是否为撇号场景 if (prev_char.isalpha() and next_char.isalpha()) \ or (prev_char in ('', ' ') and next_char.isalpha()) \ or (prev_char.isalnum() and next_char in (' ', '.', ',', '?', '!', ')')): chars[i] = '’' else: if (prev_char in ('', ' ', '-', '(') or not single_open): chars[i] = '‘' single_open = True else: chars[i] = '’' single_open = False return ''.join(chars)
现在主流的文字处理软件、排版工具(比如微软Word、LaTeX的csquotes包)都内置了这套逻辑,你给出的三个示例都可以被完美转换。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

