Python正则表达式:如何移除成对单引号并保留单个单引号
解决成对单引号移除但保留单个单引号的正则问题
问题分析
你当前用的正则r"\'(.*?)\'"搭配空字符串替换,会把匹配到的引号+内容全部删除,核心原因是没保留捕获组里的内容,直接替换成了空。
解决方案
根据你要移除包裹内容的成对单引号、保留Apple’s这类单个单引号的需求,有两种实用实现方式:
1. 捕获组保留内容(移除所有成对单引号)
用正则捕获引号中间的内容,替换时引用捕获组,只去掉前后的单引号:
import re # 测试案例 test_cases = ["'Apple'", "'[apple]'", "Apple's", "'Apple' and 'Banana'"] for case in test_cases: result = re.sub(r"'(.*?)'", r"\1", case) print(f"原字符串: {case} → 处理后: {result}")
输出结果:
原字符串: 'Apple' → 处理后: Apple 原字符串: '[apple]' → 处理后: [apple] 原字符串: Apple's → 处理后: Apple's 原字符串: 'Apple' and 'Banana' → 处理后: Apple and Banana
- 正则说明:
'(.*?)'匹配成对单引号,(.*?)以非贪婪模式捕获引号间的所有内容;替换为\1表示保留捕获到的内容,仅去掉前后引号。
2. 匹配首尾成对引号(仅移除包裹整个字符串的单引号)
如果你的需求只是移除包裹整个字符串的成对单引号,不处理字符串内部的成对引号,可以用锚点限定匹配范围:
import re test_cases = ["'Apple'", "'[apple]'", "Apple's", "Hello 'Apple' world"] for case in test_cases: result = re.sub(r"^'(.*)'$", r"\1", case) print(f"原字符串: {case} → 处理后: {result}")
输出结果:
原字符串: 'Apple' → 处理后: Apple 原字符串: '[apple]' → 处理后: [apple] 原字符串: Apple's → 处理后: Apple's 原字符串: Hello 'Apple' world → 处理后: Hello 'Apple' world
- 正则说明:
^匹配字符串开头,$匹配字符串结尾,确保只替换首尾的成对单引号。
关键注意点
- 别用空字符串替换,要通过捕获组
\1保留需要的内容; - 非贪婪模式
.*?能避免错误匹配多个成对引号之间的所有内容(比如防止把'A' 'B'误匹配成整个'A' 'B')。
内容的提问来源于stack exchange,提问作者Mk88
相关产品推荐
相关产品推荐

