python 中针对 JSON 的负正则表达式模式匹配

Negative regex pattern matching in python for JSON

我相信这可能已经被问过很多次了,但我找不到让它适用于 json 内容的方法。结果否定模式匹配所有 json 字符串(即使子字符串存在)。我确定,我可能做错了什么。

想法是匹配json中没有"key"字符串的字符串,而不匹配其中有"key"字符串的字符串。

注意:我确实需要通过带有负正则表达式的“re.match”来实现这一点(而不是通过匹配它并在 python 中取反),因为我在有很多表达式,并且不能真正改变一个表达式的函数方式。

例如下面是我的两个json字符串

'{"key": "success", "name": "peter"}'
'{"name": "sam"}'

我使用下面的正则表达式模式进行否定匹配

((?!key).).*

结果是

Python 3.9.5 (default, May 11 2021, 08:20:37) 
[GCC 10.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> pattern = r"((?!key).).*"
>>> jsonstring = '{"key": "success", "name": "peter"}'
>>> re.match(pattern, jsonstring)
<re.Match object; span=(0, 35), match='{"key": "success", "name": "peter"}'>

>>> jsonstring = '{"name": "sam"}'
>>> re.match(pattern, jsonstring)
<re.Match object; span=(0, 15), match='{"name": "sam"}'>

我在这里做错了什么吗?正在尝试不同的模式,但到目前为止没有成功。

((?!key).).* 匹配不以“key”开头(更准确地说,不能跟在开头)的正序列字符 ..*(相当于 .+)通过“钥匙”这个词)。事实上,这两个字符串都不以单词“key”开头,因此它们都匹配模式。 请注意,括号在这里没有用。

您可能想使用 (?!.*"key").*:

>>> import re
>>> pattern = r"(?!.*\"key\").*"
>>> jsonstring = '{"key": "success", "name": "peter"}'
>>>

>>> jsonstring = '{"name": "sam"}'
>>> re.match(pattern, jsonstring)
<re.Match object; span=(0, 15), match='{"name": "sam"}'>

虽然这不是解析 JSON 字符串的好方法,但它在这种情况下有效。

最好的方法是使用 JSON 解析器:

>>> import json
>>> jsonstring = '{"key": "success", "name": "peter"}'
>>> obj = json.loads(jsonstring)
>>> "key" not in obj
False
>>> jsonstring = '{"name": "sam"}'
>>> obj = json.loads(jsonstring)
>>> "key" not in obj
True