python - Python 中的正则表达式 : what's wrong with (? <!\\)\".+(?<!\\)\"?

标签 python regex json

尝试解析引号内的 JSON 键名称,包括转义引号。 我的想法是:在引号之间取任何内容而不是,并以\

为前缀
(?<!\\)\".+(?<!\\)\"

哪里(?<!\\)\"应该筛选“但不是\”,但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 键名称,将它们转换为仅包含字母的值。转换在这里无关紧要,但目标是拆分键以正确表示层次结构。 key 采用文本形式。

编辑2:

尽管 OmnipotEntity 很可能是正确的,但编写解析器还需要等待。 下面的解决方案不支持“\”或“\\”情况,如他的评论中所示。

我解决了

"(?:\\"|[^"])*?"|(?<=\.)[^".]+?(?=\.)|^[^".]+?(?=\.)|(?<=\.)[^".]+?$

受到 Avinash Raj 的回答的启发 但添加对未用双引号括起来的键的支持: 以 结尾的行开头没有引号。 。 key 。 和 .lastkey 当用相同的正则表达式替换 [empty] 时,应该找到比找到的字符串数量少 1 个元素,否则会出错。 像 .. 在“”之外的东西将无法通过该测试

最佳答案

从根本上来说,在一般情况下使用正则表达式来匹配带引号的字符串是不可能的。 JSON 不是正则语言(所有正则语言都是 LL(1) 但并非所有 LL(1) 语言都是正则,JSON 就是其中之一),因此无法通过正则表达式进行匹配。

Avinash Raj 的正则表达式 (?<!\\)".*?(?<!\\)"例如,在 "\\" 案例中失败。因为引用前面有 \但反斜杠不能起到转义的作用。但你不能对这种情况进行特殊处理,因为 "\\\""将失败。如果你遇到这种情况,你可以只使用 4 \然后 5 \等等

Lookbehind 不是标准正则表达式的一部分,因此它们可以匹配比简单正则表达式更多的语法。因此,您也许能够想出一个适用于这种情况的正则表达式。然而,我建议编写一个解析器,对于 LL(1) 语法来说它们很容易做到。它将变得更容易、更容易理解、更不易损坏,并为您提供更多的手段来处理不合格的 JSON,并让您能够在这种情况下编写更好的诊断消息。

关于python - Python 中的正则表达式 : what's wrong with (? &lt;!\\)\".+(?&lt;!\\)\"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27461618/

相关文章:

python - 仅当不存在相同线程名称作为事件线程时才创建线程(Python)

regex - powershell-替换正则表达式

json - Nativescript中如何显示Json数据

ruby-on-rails - 在 ruby​​ on rails 中附加到 Json 数组

python相当于scala分区

python - pyparsing 之后的下一步是什么?

python - count字符串函数的时间和空间复杂度是多少

javascript - 在 JavaScript 中匹配开始和结束引号(简单引号)

java - 用于匹配字符串中分隔符内的任何字符的正则表达式

java - 解析一个像这样的 JSON 日期 :/Date(-62135596800000)/