如何使用Regex提取字符串中Id、DisplayName后对应的所有匹配值?
正则方案实现
你之前的正则失效主要有两个原因:
\w元字符默认仅匹配ASCII范围内的字母、数字、下划线,无法覆盖日文汉字、假名、・这类全角特殊字符- 没有开启全局匹配模式,只能返回第一条匹配结果
你可以用以下规则实现需求:
- 匹配所有
DisplayName对应值:
(?<=DisplayName\\?["']=>\\?["'])[^"']+
规则说明:用[^"']匹配除双引号、单引号外的所有字符,自动截断到值的结束位置,支持任意语言字符和特殊符号。
2. 匹配所有Id对应值:
(?<=Id\\?["']=>\\?["'])\d+
规则说明:Id值均为数字,直接用\d+匹配即可。
使用时开启全局匹配模式即可拿到所有结果,比如Python中用re.findall、JavaScript中给正则加/g标识。
更稳妥的结构化解析方案
你提供的字符串本质是类Hash的序列化格式,直接转成结构化对象解析比正则更稳定,不会因为转义字符变化、格式调整出现匹配错误问题,操作步骤如下:
- 把字符串中的
=>全部替换为:,转成标准JSON格式 - 解析为字典对象后递归遍历所有层级,提取对应键的值即可
Python实现示例:
import json # 原始待解析字符串 raw_str = "{\"Ancestor\"=>{\"Ancestor\"=>{\"Ancestor\"=>{\"Ancestor\"=>{\"ContextFreeName\"=>\"本\", \"DisplayName\"=>\"本\", \"Id\"=>\"465392\"}, \"ContextFreeName\"=>\"本\", \"DisplayName\"=>\"ジャンル別\", \"Id\"=>\"465610\"}, \"ContextFreeName\"=>\"ビジネス・経済\", \"DisplayName\"=>\"ビジネス・経済\", \"Id\"=>\"466282\"}, \"ContextFreeName\"=>\"経営学・キャリア・MBA\", \"DisplayName\"=>\"経営学・キャリア・MBA\", \"Id\"=>\"492076\"}, \"ContextFreeName\"=>\"経営学・キャリア・MBAの起業・開業\", \"DisplayName\"=>\"起業・開業\", \"Id\"=>\"492058\", \"IsRoot\"=>false}" # 转换为标准JSON并解析 data = json.loads(raw_str.replace("=>", ":")) display_names = [] ids = [] # 递归提取目标值 def extract(obj): if not isinstance(obj, dict): return if "DisplayName" in obj: display_names.append(obj["DisplayName"]) if "Id" in obj: ids.append(obj["Id"]) for val in obj.values(): extract(val) extract(data) # 输出结果 # display_names: ['本', 'ジャンル別', 'ビジネス・経済', '経営学・キャリア・MBA', '起業・開業'] # ids: ['465392', '465610', '466282', '492076', '492058']
方案选择建议
临时提取数据用正则足够方便,生产环境建议使用结构化解析方案,容错率更高。
内容的提问来源于stack exchange,提问作者Fudge
相关产品推荐
相关产品推荐

