2015-01-05 142 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

相关问题