鉴于这个凌乱的字符串:
66,"Hi":"11.00","sth":"187,"Hi":"13.00"[5]"53","target":{"sth2"
我想匹配13.00
和 sth2
(我需要忽略 的Hi
值11.00
)。
我的正则表达式"Hi":"(.{0,5})".+"target":{"(.*)"
不能这样做,因为它匹配最左边的值Hi
,这里:11.00
我正在寻找一种解决方案,它不允许word本身和Hi
word 之间存在。Hi
target
鉴于这个凌乱的字符串:
66,"Hi":"11.00","sth":"187,"Hi":"13.00"[5]"53","target":{"sth2"
我想匹配13.00
和 sth2
(我需要忽略 的Hi
值11.00
)。
我的正则表达式"Hi":"(.{0,5})".+"target":{"(.*)"
不能这样做,因为它匹配最左边的值Hi
,这里:11.00
我正在寻找一种解决方案,它不允许word本身和Hi
word 之间存在。Hi
target
尝试将您的正则表达式更改为以下内容:
"Hi":"(.{0,5})"(?:(?!"Hi").)+"target":{"(.*)"
这里唯一的区别是更改.+
为(?:(?!"Hi").)+
. The(?!"Hi")
是一个否定的前瞻,如果下一个字符是 ,它将失败"Hi"
,因此通过将它放在重复中的 the 之前,.
它将确保没有该字符串的出现与.+
.
例子:
>>> regex = re.compile(r'"Hi":"(.{0,5})"(?:(?!"Hi").)+"target":{"(.*)"')
>>> text = '66,"Hi":"11.00","sth":"187,"Hi":"13.00"[5]"53","target":{"sth2"'
>>> regex.search(text).groups()
('13.00', 'sth2')
这是将此类要求添加到正则表达式的一种很好的通用方法,但在您的情况下,您也可以将 a.*
放在当前正则表达式的开头。这将在字符串的开头贪婪地匹配尽可能多的字符,因此您将匹配最右边出现的"Hi"
.