使用Regex使用python解析URL的某些部分

时间:2016-08-24 23:10:36

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

假设我有一些如下所示,

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

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

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

有人可以帮我修改已经存在的正则表达式以满足这种需求吗?

由于

3 个答案:

答案 0 :(得分:2)

我使用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']

答案 1 :(得分:0)

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

它会包含结尾的' +',它不包含在您想要的输出中,但似乎符合您提到的标准,因此如果您不这样做,可能需要进行一些修改# 39;我想要任何落后的' +。

答案 2 :(得分:0)

尝试使用unsuccesfully 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