2013-04-29 31 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"最右邊的發生。

相關問題