【发布时间】:2015-02-12 05:24:20
【问题描述】:
试图解析引号内的 JSON 键名,包括转义的引号。 我的想法是:在引号 not 之间取任何东西,前缀为 \
(?<!\\)\".+(?<!\\)\"
(?<!\\)\" 应该筛选 " 但不是 \" 但 Python 抱怨括号不平衡。
如果我使用(?<!\\\)\" Python 很高兴,但这不起作用:
re.findall('(?<!\\\)\".+(?<!\\\)\"','"this is \"the\". key"."and this.is.the.child"')
线索:
['"this is "the". key"."and this.is.the.child"']
当我期望时:
['"this is "the". key"', '"and this.is.the.child"']
在用 " 括起来的点处分割,不要转义。
我觉得我需要一个“任何东西,但没有转义双引号”在中间,但如果
[^"] 筛选除双引号外的任何内容,我不知道如何在将字符作为文字的 [ ] 集中否定 (?<!\\\)\" 表达式。
我想要[^(?<!\\\)\"] 之类的东西,但这不起作用。
我尝试了 [[^"]|(\")]+ (除了双引号或 \" 之外的任何东西),但这似乎也不起作用......
似乎找不到正确的方法来执行此操作... 有什么想法吗?
感谢您的帮助
编辑:
我的真正目标是能够拆分完整的“文本”JSON 键名,以将它们转换为仅包含字母数字的值。转换在这里无关紧要,但目标是拆分键以正确表示层次结构。键是文本形式。
编辑 2:
即使 OmnipotentEntity 很可能是正确的,编写解析器也必须等待.. 下面的这个解决方案不支持他的 cmets 中指出的 "\" 或 "\\" 情况。
我和
"(?:\\"|[^"])*?"|(?<=\.)[^".]+?(?=\.)|^[^".]+?(?=\.)|(?<=\.)[^".]+?$
灵感来自 Avinash Raj 的回答 但添加了对不包含在双引号中的键的支持: 没有以 . 结尾的行开头的引号。 。钥匙。 和 .lastkey 当用相同的正则表达式替换 [empty] 时,应该找到比找到的字符串数少 1 个元素,否则会出错。 像 .. outside "" 之类的东西将无法通过该测试
【问题讨论】:
-
虽然 JSON 是 LL(1) 语言,但它不是常规语言。使用正则表达式你可能会糊涂,但我建议编写一个实际的解析器,而不是依赖正则表达式,因为这样更容易推理和指出错误。