簡體   English   中英

用於 JSON 的 Python 中的負正則表達式模式匹配

[英]Negative regex pattern matching in python for 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM