本文介绍如何使用正则表达式准确识别字符串中是否存在标准或 unicode 智能引号(如 “” ‘’ 以及 ` 等),涵盖常见引号字符清单、正则写法、实用检测逻辑及注意事项。
在文本处理中,尤其是从富文本(如 Word、网页、Markdown 编辑器)中提取内容时,用户输入的引号往往不是 ASCII 的 straight quotes(” 和 ‘),而是 Unicode 中的“智能引号”(smart quotes)——例如左双引号 “(U+201C)、右双引号 ”(U+201D)、左单引号 ‘(U+2018)、右单引号 ’(U+2019),甚至还有反引号 `(U+0060)和弯引号变体(如 U+201A、U+201B、U+201E 等)。若仅用 ‘”‘ 或 “‘” 匹配,极易漏检。
✅ 推荐检测思路:不依赖复杂分组,而采用「排除法」字符类 + re.sub() 留痕判断
即构造一个否定字符类 [^…],匹配并清除所有非目标引号字符;若剩余字符串非空,则说明原串至少含一个目标引号。
以下是常用引号字符的完整推荐集合(兼顾兼容性与实用性):
| 类型 | Unicode 名称 | Python 字符表示 | Unicode 码点 |
|---|---|---|---|
| 左双引号 | LEFT DOUBLE QUOTATION MARK | “ | \u201c |
| 右双引号 | RIGHT DOUBLE QUOTATION MARK | ” | \u201d |
| 左单引号 | LEFT SINGLE QUOTATION MARK | ‘ | \u2018 |
| 右单引号 | RIGHT SINGLE QUOTATION MARK | ’ | \u2019 |
| 低双引号 | DOUBLE LOW-9 QUOTATION MARK | „ | \u201e |
| 单低引号 | SINGLE LOW-9 QUOTATION MARK | ‚ | \u201a |
| 反引号(常用于代码/旧式引用) | GRAVE ACCENT | ` | \u0060 | |
| ASCII 双引号 | QUOTATION MARK | “ | \u0022 |
| ASCII 单引号 | APOSTROPHE | ‘ | \u0027 |
对应正则表达式(原始字符串写法,避免转义干扰):
import re
QUOTE_PATTERN = r'[^“”‘’‚„"`\'`]' # 注意:` 在字符类中无需转义,但为清晰可保留
# 更严谨的写法(显式列出所有需保留的引号):
QUOTE_CHARS = '“”‘’‚„"`\'`' # 注意:此处 ` 是反引号,不是单引号
quote_regex = f'[^{re.escape(QUOTE_CHARS)}]'
✅ 实用检测函数示例: