如何用Python正则表达式提取含单引号的单引号内文本?
解决含未转义单引号的类JSON文本提取问题
核心问题分析
你遇到的问题根源是文本中的内部单引号未转义,导致按, 拆分和简单正则[^']+都会提前终止匹配。这类文本属于不规范的类Python字典格式,而非标准JSON(标准JSON用双引号),所以直接用JSON解析器会失败,但可以通过修复格式或调整正则来解决。
方案一:修复格式后用安全解析工具(推荐)
这种方法比正则更可靠,利用Python的ast.literal_eval安全解析修复后的类字典字符串:
import re import ast # 原始待处理文本 raw_str = "{'pro_id':'1692423', 'pro_model':'SKUF42051', 'pro_category':'accessories', 'pro_name':'Gants tactiques Escalade en plein air Gants antidérapants résistants à l'usure Formation Gants de moto d'équitation', 'pro_current_price':'27.99', 'pro_raw_price':'27.99', 'pro_discount':'36', 'pro_likes_count':'11'}" # 第一步:修复内部未转义的单引号(替换非边界的单引号为转义单引号) fixed_str = re.sub(r"(?<=[^'])'(?=[^'])", r"\'", raw_str) # 第二步:用ast.literal_eval解析为字典(比eval安全,不会执行恶意代码) data = ast.literal_eval(fixed_str) # 直接获取目标字段 print(data['pro_name']) # 输出:Gants tactiques Escalade en plein air Gants antidérapants résistants à l'usure Formation Gants de moto d'équitation
原理说明
re.sub(r"(?<=[^'])'(?=[^'])", r"\'", raw_str):用正则匹配不在引号首尾的单引号(即被普通字符包裹的单引号),替换为转义单引号\',让文本符合Python字典的语法规范。ast.literal_eval:专门用于解析Python字面量(如字典、列表、字符串等),不会执行任意代码,比eval更安全。
方案二:调整正则表达式匹配键值对
如果必须用正则,可通过正向预查确保值的匹配范围正确,不被内部单引号打断:
import re raw_str = "{'pro_id':'1692423', 'pro_model':'SKUF42051', 'pro_category':'accessories', 'pro_name':'Gants tactiques Escalade en plein air Gants antidérapants résistants à l'usure Formation Gants de moto d'équitation', 'pro_current_price':'27.99', 'pro_raw_price':'27.99', 'pro_discount':'36', 'pro_likes_count':'11'}" # 匹配键值对的正则:匹配'键':'值',值的结束位置为', 或'}$ pattern = r"'([^']+)':'(.*?)(?=(?:',|'}$))'" # 查找所有匹配项并转为字典 matches = re.findall(pattern, raw_str, re.DOTALL) data = dict(matches) print(data['pro_name'])
正则解释
'([^']+)':匹配键(被单引号包裹,内部无单引号)。'(.*?)(?=(?:',|'}$))':匹配值,.*?非贪婪匹配任意字符,(?=(?:',|'}$))是正向预查,确保匹配到下一个,前的单引号,或文本末尾的'},避免提前终止。re.DOTALL:让.匹配换行符(如果文本有换行的话)。
总结
优先选择方案一,因为正则匹配对文本格式的一致性要求极高,一旦格式有微小变化(如空格、换行)就会失效;而ast.literal_eval在修复格式后能稳定解析结构,后续操作更便捷。
内容的提问来源于stack exchange,提问作者Edwin Jose
相关产品推荐
相关产品推荐

