2017-08-11 72 views
2

給定以下字符串;在需要非貪婪匹配的情況下匹配正則表達式

我想匹配"And now for something completely different!"(Monty Python),通過引用引號和括號。在此示例中,"Hello"不應匹配,因爲引號後沒有括號。

非貪婪的方法看起來就像一條路可走:".*?"比賽"Hello""And now for something completely different!"分開,這是接近的,但如果我追加到這個支架,".*?"(.*),我結束了整個字符串匹配。

也就是說

"Hello", he said. "And now for something completely different!"(Monty Python) 

返回。

如何強制我的正則表達式按照我的要求行事?我在python中工作,所以可以選擇使用lookahead/behind。

+0

要匹配字面括號,使用反斜線轉義或放入類中,否則它們將打開捕獲組。此外,我寧願使用否定類而不是非貪婪點,它不會給你從最後的最短匹配。 –

回答

2

這工作:

"[^"]*"(:?\(.*\)) 

它查找一組引號(即沒有引號之間) 後面跟着一組括號

1

你可以試試這個:

s = '"Hello", he said. "And now for something completely different!"(Monty Python).' 

import re 

new_data = re.findall('"(.*?)"', s) 

final_data = [i for i in new_data if len(re.findall("\w+(?=!)", i)) > 0][0] 

輸出:

'And now for something completely different!'