2012-12-27 143 views
2

我試圖使用re.findall與後視和前瞻提取數據。當我不使用raw_input變量時,正則表達式正常工作,但我需要用戶能夠輸入各種不同的搜索詞。Python正則表達式findall與變量

下面是當前的代碼:

me = re.findall(r"(?<='(.+)'+variable+'(.+)')(.*?)(?='(.+)+variable+(.+)')", raw) 

正如你所看到的,我試圖拔出一個搜索詞之間的字符串。

但是,每次使用這種格式時,我都會得到一個固定寬度的錯誤。有沒有辦法解決?

我也嘗試了以下格式,但沒有成功。

variable = raw_input('Term? ') 
'.*' + variable + '.*' 

'.*%s.*' % (variable,) 

'.*{0}.*'.format(variable) 

'.*{variable}.*'.format(variable=variable) 
+0

我其實不太確定你想在這裏實現什麼。表達式中的'''和'+是你的原始字符串的一部分,所以你沒有進行連接。 –

+0

你能提供一個示例字符串和你想要提取的內容嗎? – mVChr

+0

字符串應該是這樣的:raw =「魚,鉤子,吞食,捲起,船,魚。」如果魚被設置爲變量,我想捕獲所有魚之間的詞。輸出將是:「鉤,吞下,捲起,船,魚。」 – user1882766

回答

0

我不確定這是不是你的意思,但它可能會讓你開始。據我瞭解你的問題,你不需要lookaheads或lookbehinds。這就是Python 2.x的(不會與Python 3工作):

>>> import re 
>>> string_to_search = 'fish, hook, swallowed, reeled, boat, fish' 
>>> entered_by_user = 'fish' 
>>> search_regex = r"{0}(.+){0}".format(entered_by_user) 
>>> match = re.search(search_regex, string_to_search) 
>>> if match: 
...  print "result:", match.group(1).strip(' ,') 
... 
result: hook, swallowed, reeled, boat 

如果你真的想在結果最後的「魚」作爲您的評論上方,然後只是刪除從第二{0}format()字符串。

+0

我剛剛意識到我一直不清楚。我很抱歉,並感謝海報的耐心。上述搜索方法的問題是,如果我在字符串中有多個項(例如「魚,鉤,魚,捕獲,卷軸,魚」),那麼我只會得到第一個和最後一個「魚」之間的內容。我確實需要每個「魚」實例之間的每個詞。用外觀和前瞻方法做這件事沒有任何問題;但是,我不能使用raw_input來指導搜索。 – user1882766

+0

如果你在'+'之後添加'?',這個解決方案能做到你想要的嗎?換句話說,'search_regex = r「{0}(。+?){0}」.format(entered_by_user)' –

0

回顧後通常執行(包括它的Python實現)的方式有你的固有限制不幸的是運行到:lookbehinds不能是可變長度的。 「關於Lookbehind的重要提示」部分here解釋了原因。儘管如此,我認爲你應該能夠在不存在逆序的情況下執行正則表達式。