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

Posted

技术标签:

【中文标题】Python - 将字符串格式化为 url 的最短方法【英文标题】:Python - Shortest way to format a string to an url 【发布时间】:2014-06-02 05:44:18 【问题描述】:

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

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

所以,假设我们有一个标题,从表单中获取:

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()

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

我还想知道应该从 url 中删除哪些字符/符号。

【问题讨论】:

Canonize / normalize an URL in Python的可能重复 @aspect_mkn8rd 不,不是 见String slugification in Python。 @heinst 啊-(那我很抱歉。 【参考方案1】:

您可以使用urlencode(),这是 Python 中 url 编码字符串的方式。

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

>>>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

【讨论】:

哇,这真是太聪明了!比我的回答简洁多了。我会对速度感兴趣,但老实说,这似乎不是一个会限制性能的功能,所以担心这一点肯定是早期优化 @AdamSmith translate 非常快,我真的尽量避免使用正则表达式,但使用它们似乎非常简单:)【参考方案2】:

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

假设您尝试使用 URL 查询字符串中的文本,这将起作用。

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

【讨论】:

根据 OP:“这样其他人就可以毫无问题地阅读它/头痛/无论如何。”我只是看着%2C 就头疼 :) 否则一个出色的解决方案,我会自己使用,所以仍然 +1 @AdamSmith 我以为 OP 指的是代码可读性,而不是 url,但我可能弄错了。 @jshanley 在第二次阅读时,您可能是对的。无论如何,这是最好的解决方案:) 我也对 OP 的可读性评论和输出示例感到困惑。这当然是 Python 中 url 编码字符串的 方式 :)【参考方案3】:

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

注意:不要太认真地对待这些“基准”,因为我没有仔细研究所有可能的计划,但这是快速了解全局的好方法。 p>

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,牛头犬之间的招财猫。

【讨论】:

【参考方案4】:
import re
re.sub(r'!|\?|,', '', text)

这将删除! ?和 , 从字符串中。

【讨论】:

【参考方案5】:

我的意思是你可以把它分成多个语句:

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

这将提高可读性。

【讨论】:

【参考方案6】:

确定你可以这样做:

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)

你也可以做一个列表比较,然后''.join它。

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

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

【讨论】:

以上是关于Python - 将字符串格式化为 url 的最短方法的主要内容,如果未能解决你的问题,请参考以下文章

通过 URL 将用户所在的 URL 提交到另一个进程的最简洁、最短的 Javascript 是啥?

如何将整数转换为 Python 中最短的 url 安全字符串?

如何将 NSString 格式化为 URL?

当 .toFixed(2) 小数点后为零时,如何将浮点数格式化为整数?

在python中将长数字格式化为字符串

将字符串格式化为仅在 python 中的单词之间有 n 个空格