2015-01-05 184 views
0

我想寫一個正則表達式使用串以下列方式確定一個令牌:正則表達式來處理字母,數字和%符號

'eyAidXNlcl9pZCI6NywidG9rZW5fY3JlYXRpb25fdGltZSI6MTQyMDQ4NTUyMS4zNyB9%0A'

'eyJ1c2VyX2lkIjo3LCJ0b2tlbl9jcmVhdGlvbl90aW1lIjoxNDIwNDk0MTcxLjc5fQ%3D%3D'

我的Django的網址結構使用以下模式:

url(r'^(?P<object_id>\d+)/email/(?P<token>[a-f0-9]{100})/(?P<pk>\d+)/$', objects.ObjectDetail.as_view(), name="create-using-token"),

我不知道什麼正則表達式來解析令牌(?P<token>[a-f0-9]{100})應該是因爲我不確定如何處理%符號。我生成這些令牌別處使用urllib(具體而言,urllib.quote(string.encode("base64"))

我在殼測試該代碼塊如下:

import re 
token = 'eyAidXNlcl9pZCI6NywidG9rZW5fY3JlYXRpb25fdGltZSI6MTQyMDQ4NTUyMS4zNyB9%0A' 
pattern = '\w+\W+' 
re.findall(pattern, token) 

我使用[a-f0-9]{100}'\w+\W+'[\w|\W]試過。這些變得非常接近,但我不知道如何處理這個%符號,因爲它們要麼分開,要麼忽略%之後的符號。

我用下面的方法生成令牌:

def generate_token(): 
    now = time.time() 
    raw_string = '{{"random_number":{random_number},"token_creation_time":{now}}}'.format(
    random_number=random_number, 
    now=now).strip() 
    token = raw_string.encode("base64") 
    return urllib.quote(token) 

每@ alecxe的建議,我曾與.rstrip('\n')嘗試刪除\n,編碼增加了,但是我仍然需要能夠識別包含%符號標記

回答

2

如果您解除引用%0A,你會看到,這是一個新的行字符:

>>> import urllib 
>>> urllib.unquote('%0A') 
'\n' 

您可能不小心將其留在了令牌字符串中。我認爲你不需要令牌來包含它,因此你不需要在最後嘗試將該令牌與新行匹配。在generate_token()功能


展望。 base64 encoder的功能是在編碼字符串的末尾添加尾隨的新行。剝離它:

token = raw_string.encode("base64").rstrip('\n') 
+0

這很奇怪。我以編程方式生成它們,並使用'「」.format()構造我的字符串'我在最後沒有添加新行。 – djq

+0

@celenius如果您在發送令牌之前調用字符串['strip()'](https://docs.python.org/2/library/stdtypes.html#str.strip),該怎麼辦? – alecxe

+0

即使使用'strip()'它仍然以'%0A'結尾 – djq

相關問題