我参与了一个网络项目。我必须选择代表代码的最佳方式,以便其他人可以毫无问题/头痛/无论如何阅读它。
我现在解决的“问题”是显示一个很好的格式化网址(将取自“标题”字符串)。
所以,我们假设我们有一个标题,取自表格:
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()
什么是压缩它的好方法?是否已经有了做我正在做的事情的功能?
我也想知道我应该从网址中删除哪些字符/符号。
答案 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()
这将提高可读性。