2012-09-29 13 views
2

我想從字符串'/?user=hello&user=man&user='中提取'user='之後的任何字符串。在這種情況下,我會得到我'hello','man'''使用正則表達式在'/?user = hello&user = man&user ='中查找'hello','man'和''

我被困在這裏:

>>> import re 

>>> s = '/?user=hello&user=man&user=' 
>>> re.findall("user=(.*)",s) 
['hello&user=man&user='] 

我能找到我想要的東西如果user=的最後一次出現也與&結束,但沒有任何人知道如何在這個字符串找到['hello', 'man', '']

+2

小心你的貪婪搜索參數。 – L0j1k

+0

'。*'是一個貪婪的量詞,它總是試圖匹配它所能達到的最大值,而不是'。*'你應該使用'。*?'非貪婪版本。所以,試試這個're.findall(r'user =(。*?)&',s)' – RanRag

回答

11

我將放棄re和使用的工具意味着這樣的:

from urlparse import urlsplit, parse_qs 

s = '/?user=hello&user=man&user=' 
parse_qs(urlsplit(s).query, keep_blank_values=True) 
{'user': ['hello', 'man', '']} 
+2

這也是我的想法,但顯然最後的''''也很重要。將'True'作爲第二個參數傳遞給'parse_qs',這將是完美的。 –

+1

@LinusGThiel知道'keep_blank_values'但誤讀了OP - 感謝編輯 –

3

嘗試以下操作:

>>> s = '/?user=hello&user=man&user=' 
>>> re.findall(r"user=([^&]*)", s) 
['hello', 'man', ''] 
0

是的,你需要做一個正則表達式是不是「貪婪」和抓取最後的user=作爲您正在測試的(。*)的發生。更具體地說,user=(.*)?user=(.*)?user=(.*)只會匹配第一次發生的數據,而不會匹配每個角色的大塊。那是什麼?運算符用正則表達式。

相關問題