python - python中用于JSON的负正则表达式模式匹配
问题描述
我相信这可能已经被问过很多次了,但我找不到让它适用于 json 内容的方法。结果否定模式匹配所有 json 字符串(即使子字符串存在)。我敢肯定,我可能做错了什么。
想法是匹配其中没有“key”字符串的json字符串,而不是匹配其中包含“key”字符串的json字符串。
注意:我确实需要通过带有负正则表达式的“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”开头,所以它们都匹配模式。请注意,括号在这里是无用的。
您可能想使用(?!.*"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
推荐阅读
- reactjs - 如何固定卡片并将3张卡片放在同一行?
- python - Keras 序列模型训练样本小于输入
- javascript - CORS 标头问题表达 Angular
- go - 如何在 Golang 内部结构中使用 omitempty 标志更新 Mongodb 字段
- mule - 如何使线程在 Mule4 中休眠?
- math - 使用最小二乘法的凸优化问题的封闭形式
- javascript - 问题:TypeError:无法读取 null 的属性“getBoundingClientRect”
- qt - QML 响应式网格布局
- php - PDO 中的类对象不适用于 SQL 更新
- c++ - 乘以 32 位整数的向量,只取高 32 位