如何用正则表达式提取JSON中description字段的完整值?
解决JSON格式异常的description字段提取问题
嘿,我明白你遇到的麻烦了——JSON格式有问题没法用库解析,想用正则提取完整的description值,但之前的正则没起作用对吧?
先说说你原来的正则为什么只返回['description']:description(?:\w+){0,23}这个表达式里,(?:\w+)是匹配字母、数字或下划线,但你的字段名后面跟着的是"、:这些非\w的字符,所以这部分根本匹配不到,自然就只捕获了字段名本身。
要提取description对应的完整值,我们需要针对性地写正则,考虑到值里可能包含换行(比如你的例子里有\n),可以试试下面的方案:
基础解决方案(处理包含换行的普通内容)
import re # 调整字符串写法更清晰,保留原内容的转义和换行 description_input = r"'description\" : \"this is a test \n another test\" " # 正则表达式:匹配字段名、冒号、引号,捕获引号内所有内容(包括换行) matches = re.findall(r'description\s*:\s*"([\s\S]+?)"', description_input, re.IGNORECASE) if matches: full_desc = matches[0] print("提取到的完整description:") print(full_desc)
正则解释:
description:匹配目标字段名,re.IGNORECASE确保不区分大小写\s*:匹配字段名与冒号、冒号与引号之间的任意空白字符(允许无空白)":匹配值的开头引号([\s\S]+?):核心捕获组,[\s\S]匹配任意字符(包括换行符\n),+?是非贪婪模式,确保只匹配到最近的结尾引号,避免过度匹配":匹配值的结尾引号
运行这段代码后,你会得到完整的内容:
this is a test another test
进阶:处理包含转义引号的内容
如果你的description值里有转义的引号(比如"this is a \"sample\" text"),上面的正则会提前终止匹配,这时候可以用更健壮的正则:
import re description_input = r"'description\" : \"this is a \"test\" with quotes\n another line\" " matches = re.findall(r'description\s*:\s*"((?:\\.|[^"])+)"', description_input, re.IGNORECASE) if matches: full_desc = matches[0].replace('\\"', '"') # 还原转义的引号 print(full_desc)
这个正则里的(?:\\.|[^"])+表示:要么匹配转义字符(比如\"),要么匹配非引号的普通字符,这样就能正确处理带转义引号的内容了。
内容的提问来源于stack exchange,提问作者blue-sky




