【问题标题】:Use Regex to parse out some part of URL using python使用正则表达式使用 python 解析出 URL 的某些部分
【发布时间】:2016-08-24 23:10:35
【问题描述】:

假设我有一些类似的东西,

URL
http://hostname.com/as/ck$st=fa+gw+hw+ek+ei/
http://hostname.com/wqs/ck$st=fasd+/
http://hostname.com/as/ck$st=fa+gq+hf+kg+is&sadfnlslkdfn&gl+jh+ke+oj+kp sfav

我想检查 url 中的第一个 + 符号并向后移动,直到找到特殊字符,例如 / 或 ?或 = 或任何其他特殊字符,然后从它开始,直到找到空格或行尾或 & 或 /。

我在stackoverflow论坛的帮助下写的正则表达式如下,

re.search(r"[^\w\+ ]([\w\+ ]+\+[\w\+ ]+)(?:[^\w\+ ]|$)", x).group(1)

这个适用于第一行。但不解析第二行的任何内容。同样在第三行,我想在该行中检查多个这样的模式。当前的正则表达式只检查一种模式。

我的输出应该是,

parsed
fa+gw+hw+ek+ei
fasd
fa+gq+hf+kg+is gl+jh+ke+oj+kp

谁能帮我修改已经存在的正则表达式以满足这种需求?

谢谢

【问题讨论】:

    标签: python regex python-2.7 python-3.x


    【解决方案1】:

    我用 regexr 想出了这个 (regexr link):

    ([\w\+]*\+[\w\+]*)(?:[^\w\+]|$)

    匹配:

    fa+gw+hw+ek+ei fasd+ fa+gq+hf+kg+is gl+jh+ke+oj+kp

    编辑:不要使用 re.search,而是尝试使用 re.findall:

    >>> s = "http://hostname.com/as/ck$st=fa+gq+hf+kg+is&sadfnlslkdfn&gl+jh+ke+oj+kp sfav"
    >>> re.findall("([\w\+]+\+[\w\+]*)(?:[^\w\+]|$)", s)
    ['fa+gq+hf+kg+is', 'gl+jh+ke+oj+kp']
    

    【讨论】:

    • 这个不适用于第三行。它只给出 fa+gq+hf+kg+is 作为输出。我想要 fa+gq+hf+kg+is gl+jh+ke+oj+kp 作为输出。你能帮我做吗?
    • @chisrtian 这不适用于 hostname.com/wqs/ck$st=+fasd 。我们怎样才能让这个也能和这个一起工作
    • 我稍微调整了一下,将第一个 [\w\+]+ 更改为 [\w\+]*。试试看。
    【解决方案2】:

    如果您将[^\w\+ ]([\w\+ ]+\+[\w\+ ]+)(?:[^\w\+ ]|$) 更改为[^\w\+ ]([\w\+ ]+\+[\w\+ ]*)(?:[^\w\+ ]|$),它也会匹配第二个网址。

    它将包含尾随“+”,它未包含在您想要的输出中,但似乎符合您提到的标准,因此如果您不想要任何尾随“+”,则可能需要进行一些修改.

    【讨论】:

    • @this 不适用于第三行。它只给出 fa+gq+hf+kg+is 作为输出。我想要 fa+gq+hf+kg+is gl+jh+ke+oj+kp 作为输出。你能帮我做吗?
    【解决方案3】:

    在尝试使用 urlparse 失败后,似乎获得所需信息的最佳方法是使用正则表达式:

    import urlparse
    import re
    
    urls = [
        "http://hostname.com/as/ck$st=fa+gw+hw+ek+ei/",
        "http://hostname.com/wqs/ck$st=fasd+/",
        "http://hostname.com/as/ck$st=fa+gq+hf+kg+is&sadfnlslkdfn&gl+jh+ke+oj+kp sfav"
    ]
    
    for myurl in urls:
        parsed = urlparse.urlparse(myurl)
    
        print 'scheme  :', parsed.scheme
        print 'netloc  :', parsed.netloc
        print 'path    :', parsed.path
        print 'params  :', parsed.params
        print 'query   :', parsed.query
        print 'fragment:', parsed.fragment
        print 'username:', parsed.username
        print 'password:', parsed.password
        print 'hostname:', parsed.hostname, '(netloc in lower case)'
        print 'port    :', parsed.port
    
        print urlparse.parse_qs(parsed.query)
    
        print re.findall(r'([\w\+]+\+[\w\+]*)(?:[^\w\+]|$)', parsed.path)
        print '-' * 80
    

    【讨论】:

    • 这不适用于 hostname.com/wqs/ck$st=+fasd 。我们怎样才能使这项工作也与这个一起工作?可以请你吗?
    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 2012-08-23
    • 2014-06-26
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多