2013-04-29 30 views
1

鉴于这种混乱的字符串:匹配任何东西,但这个词,正则表达式的问题

66,"Hi":"11.00","sth":"187,"Hi":"13.00"[5]"53","target":{"sth2" 

我想匹配13.00sth2(我需要忽略的11.00Hi值)。

我的正则表达式,因为它的Hi最左边的值,在这里比赛"Hi":"(.{0,5})".+"target":{"(.*)"不能做到这一点:11.00

我正在寻找解决方案,将不允许Hi本身与字之间Hi字是否存在等target

+0

将'Hi'总是出现两次,还是必须的,如果对发生的可能性正则表达式的帐户一次** **还是两次? – SethMMorton 2013-04-29 22:45:17

+0

'Hi'实际上可能出现多次。 – nutship 2013-04-29 22:47:07

回答

5

试着改变你的正则表达式如下:

"Hi":"(.{0,5})"(?:(?!"Hi").)+"target":{"(.*)" 

这里唯一的不同是改变.+(?:(?!"Hi").)+。该(?!"Hi")是负先行如果下一个字符是"Hi",这将失败,因此在重复把这个刚刚.前,将确保没有该字符串的出现都为.+的一部分匹配。

例子:

>>> 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') 

这是这种类型的需求添加到正则表达式的好通用的方法,但在你的情况,你也可以只把.*在当前的正则表达式的开始。这将贪婪地在字符串的开头匹配尽可能多的字符可能的,所以你会匹配"Hi"最右边的发生。

相关问题