Python - 将字符串格式化为url的最短方式

时间:2014-04-17 19:31:03

标签: python replace slug

我参与了一个网络项目。我必须选择代表代码的最佳方式,以便其他人可以毫无问题/头痛/无论如何阅读它。

我现在解决的“问题”是显示一个很好的格式化网址(将取自“标题”字符串)。

所以,我们假设我们有一个标题,取自表格:

title = request.form['title'] # 'Hello World, Hello Cat! Hello?'

然后我们需要一个函数来格式化它以包含在url中(它需要变成'hello_world_hello_cat_hello'),所以目前我正在使用这个我认为糟糕的可读性:

str.replace(title, ' ', '-').str.replace(title, '!', '').str.replace(title, '?', '').str.replace(string, ',' '').lower()

什么是压缩它的好方法?是否已经有了做我正在做的事情的功能?

我也想知道我应该从网址中删除哪些字符/符号。

6 个答案:

答案 0 :(得分:4)

您可以使用urlencode() 方式在Python中使用url-encode字符串。

如果您想要个性化编码作为预期输出,并且您想要做的就是将单词保留在最终字符串中,您可以使用re.findall函数来抓取它们,然后将它们与下划线连接起来:< / p>

>>>s = 'Hello World, Hello Cat! Hello?'
>>>'_'.join(re.findall(r'\w+',s)).lower()
'hello_world_hello_cat_hello'

这是做什么的:

g = re.findall(r'\w+',s) # ['Hello', 'World', 'Hello', 'Cat', 'Hello']
s1 = '_'.join(g) # 'Hello_World_Hello_Cat_Hello'
s1.lower() # 'hello_world_hello_cat_hello'

此技术也适用于字符串中的数字:

>>>s = 'Hello World, Hello Cat! H123ello? 123'
>>>'_'.join(re.findall(r'\w+',s)).lower()
'hello_world_hello_cat_h123ello_123'

我认为应该更快的另一种方法是实际替换非字母数字字符。这可以通过re.sub抓住所有非字母数字来完成,并用_代替它们:

>>>re.sub(r'\W+','_',s).lower()
'hello_world_hello_cat_h123ello_123'

嗯......不是真的,速度测试:

$python -mtimeit -s "import re" -s "s='Hello World, Hello Cat! Hello?'" "'_'.join(re.findall(r'\w+',s)).lower()"
100000 loops, best of 3: 5.08 usec per loop


$python -mtimeit -s "import re" -s "s='Hello World, Hello Cat! Hello?'" "re.sub(r'\W+','_',s).lower()"
100000 loops, best of 3: 6.55 usec per loop

答案 1 :(得分:3)

您可以使用python2中urlencode()模块中的urllib或python3中的urllib.parse模块。

假设您尝试使用网址的查询字符串中的文字,这将有效。

title = {'title': 'Hello World, Hello Cat! Hello?'} # or get it programmatically as you did
encoded = urllib.urlencode(title)
print encoded # title=Hello+World%2C+Hello+Cat%21+Hello%3F

答案 2 :(得分:2)

所以我一直在玩你所有答案的解决方案,这就是我提出的问题。

注意:这些&#34;基准&#34;不要太认真,因为我没有完成所有可能的计划,但这是一个快速广泛观点的好方法。

<强> re.findall()

def findall():
  string = 'Hello World, Hello Cat! Hello?'
  return  '_'.join(re.findall(r'\w+',string)).lower()

real = 0.019s,user = 0.012s,sys = 0.004s,rough = 0.016s

<强>应用re.sub()

def sub():
  string = 'Hello World, Hello Cat! Hello?'
  return re.sub(r'\W+','_',string).lower()

real = 0.020s,user = 0.016s,sys = 0.004s,rough = 0.020s

<强> slugify()

def slug():
  string = 'Hello World, Hello Cat! Hello?'
  return slugify(string)

real = 0.031s,user = 0.024s,sys = 0.004s,rough = 0.028s

<强> urllib.urlencode()

def urlenc():
  string = {'title': 'Hello World, Hello Cat! Hello?'}
  return urllib.urlencode(string)

real = 0.036s,user = 0.024s,sys = 0.008s,rough = 0.032s

正如您所看到的,最快的是 re.findall(),最慢的 urllib.urlencode(),中间的 slugify()这也是它们中最短/最干净的(尽管不是最快)。

我现在选择的是 Slugify ,这是斗牛犬之间的幸运猫。

答案 3 :(得分:1)

import re
re.sub(r'!|\?|,', '', text)

这将删除! ?并且,从字符串。

答案 4 :(得分:0)

确定你可以这样做:

import string

uppers = string.ascii_uppercase # ABC...Z
lowers = string.ascii_lowercase # abc...z
removals = ''.join([ch for ch in string.punctuation if ch != '_'])

transtable = str.maketrans(uppers+" ",lowers+"_",removals)
title = "Hello World, Hello Cat! Hello?"
title.translate(transtable)

你也可以做一个列表comp和''.join它。

whitelist = string.ascii_uppercase + string.ascii_lowercase + " "

newtitle = ''.join('_' if ch == ' ' else ch.lower() for ch in title if ch in
             whitelist)

答案 5 :(得分:0)

我的意思是你可以把它分成多个陈述:

str = str.replace(title, ' ', '-')
str = str.replace(title, '!', '')
str = str.replace(title, '?', '')
str = str.replace(string, ',' '')
str = str.lower()

这将提高可读性。