【问题标题】:Negative regex pattern matching in python for JSON用于JSON的python中的负正则表达式模式匹配
【发布时间】:2021-10-03 00:03:38
【问题描述】:

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

想法是匹配其中没有“key”字符串的json字符串,而不匹配其中有“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"}'>

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

【问题讨论】:

    标签: python json regex key


    【解决方案1】:

    ((?!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
    

    【讨论】:

    • 很好!!这看起来不错,而且工作完美。谢谢!!我同意,这不是 json 内容最合适的方式。虽然我在函数中使用了一些模式,但它适用于所有内容,包括文本、csv 和 json。所以坚持一些共同一致的东西。另外,字典可能是嵌套的,而且很大,我可能不知道子字符串的确切位置。
    • @Danny 好的。请注意,这也将排除 "key" 作为值(例如 {"foo" : "key"})或数组项(例如 ["foo", "key"])出现在其中的字符串。为了避免最终出现误报,您可以改用r"(?!.*\"key\"\s*:).*"
    • 是的,我稍微修改了一下以适应全球性,答案给了我,我真正需要从什么开始。感谢那。而且,哦,是的,我忘了接受这个作为答案(刚刚接受了!!)非常感谢
    猜你喜欢
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多