2012-05-19 44 views
1

這是我的代碼,現在,Python的正則表達式〜簡單的問題

import re 
matches = re.search(r'^%s\s*\((.*?)\)'%"Hello", "Hello(Hi())") 
print matches.group(1) 

它得到的括號內的一切後,看到的Hello。 因此,例如,

Hello(hi) produces hi 

我有一個問題,

Hello(Hi()) produces Hi(and not Hi() 

有誰知道我怎麼可能通過改變正則表達式解決這個問題?

+0

通常不可能將任意嵌套的括號與常規epxressions匹配,因爲嵌套括號不會形成常規語言。你可以保證嵌套的上限嗎? –

+1

如果你可以保證最後的圓括號在某種程度上是獨一無二的 - 例如,在行尾,後面跟着一個空格(並且括號中沒有括號)等,那麼你可以將正則表達式的末尾定位。 – larsks

+0

你爲什麼使用搜索開始行錨?這相當於使用匹配,除了較慢。 –

回答

3

如果你在乎的是什麼在最外面的括號,然後使用$錨:

>>> re.match("Hello\((.*)\)$", "Hello(Hi())").group(1) 
'Hi()' 
>>> re.match("Hello\((.*)\)$", "Hello(Hi(Bye()))").group(1) 
'Hi(Bye())' 

如果你想匹配嵌套的括號,這對RE來說是不可能的,因爲你的語言是context-free而不是regular;相反,您可以迭代地將正則表達式應用於正則表達式匹配的結果。

+3

+1如果可能,我喜歡在最外面的括號之後匹配某個東西。但是關於'*?'的評論並不適用於你的具體例子。 '*'也可以工作,因爲默認情況下'.'與新行不匹配。例如,如果你直到空間匹配,它纔會被要求。 –

+0

我發現這個工程更好一點,謝謝 – user1357159

+0

我同意馬克。 '*?'與你的正則表達式的工作原理沒有任何關係。 '$'是你答案中的主要想法。 –

1

如果可以有任意級別的嵌套,則正則表達式不適用。

如果你可以肯定的是會有從未超過兩個級別嵌套是可以解決的,但它並不令人愉快:

re.match(r'^%s\s*\(((?:[^()]*|\([^)]*\))*)\)' % re.escape("Hello"), text) 

看到它聯機工作:ideone

+0

...現在你有兩個問題。 –