Python 在一个字符串上应用多个规则的最佳实践

Python 在一个字符串上应用多个规则的最佳实践,python,Python,我将url作为字符串获取,需要对其应用几个规则。第一条规则是删除锚点,然后删除“../”符号,因为urljoin在某些情况下连接url不正确,最后删除前导斜杠。现在我有这样的代码: def construct_url(parent_url, child_url): url = urljoin(parent_url, child_url) url = url.split('#')[0] url = url.replace('../', '')

我将url作为字符串获取,需要对其应用几个规则。第一条规则是删除锚点,然后删除“../”符号,因为urljoin在某些情况下连接url不正确,最后删除前导斜杠。现在我有这样的代码:

def construct_url(parent_url, child_url):
        url = urljoin(parent_url, child_url)
        url = url.split('#')[0]
        url = url.replace('../', '')
        url = url.rstrip('/')
        return url

但我认为这不是最好的做法。我认为可以做得简单得多。你能帮我吗?谢谢。

不幸的是,这里没有什么能让函数更简单,因为您正在处理一些非常奇怪的情况

但是,您可以使用Python将URL拆分为定义良好的组件,进行处理,然后使用以下方法将其重新组合在一起,从而使其更加健壮:

输出:

http://user:pw@google.com/chrome
使用
urlparse
中的工具有一个优点,即您确切地知道处理操作的内容(在您的案例中是路径和片段),并且它可以为您处理所有事情,如用户凭据、查询字符串、参数等


注意:与我在评论中的建议相反,
urljoin
实际上规范了URL:

>>> from urlparse import urljoin
>>> urljoin('http://google.com/foo/bar', '../qux')
'http://google.com/qux'
但它严格遵循RFC1808

发件人:

在具有定义良好的基本URL的对象中

基础:

[……]

解析器必须小心处理存在更多错误的情况 相对路径。段比 基本URL的路径。请注意,
。“
语法不能用于更改 URL的

../../../g    = <URL:http://a/../g>
../../../../g = <URL:http://a/../../g>
。/../../g=
../../../g=

因此,
urljoin
通过保留那些无关的
。/
,做了正确的事情,因此您需要通过手动处理来删除它们。

不要尝试使用正则表达式(用于此任务)@Anmol_uppal no.只是不。使用
urlparse.urlparse
比自己使用正则表达式实现URL方案解析器更不容易出错。你不认为,如果我使用正则表达式,可读性会降低?@parikLS你能举例说明你的
父url
子url
是什么样子吗?你所说的删除“../”符号是什么意思,因为urljoin在某些情况下连接url是不正确的?请你也举个例子好吗?@LukasGraf当然。父url=''子url='../../../chrome'urljoin的结果将是“非常感谢,这非常有帮助
../../../g    = <URL:http://a/../g>
../../../../g = <URL:http://a/../../g>