2016-08-24 90 views
0
解析出URL的某些部分

假设我有一些类似的下面,使用正则表达式使用Python

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中第一个+号,直到我们找到一个特别的向后移动字符如/或?或=或任何其他特殊字符,并从此开始并继续,直到找到空格或行末或&或/。

我用计算器论坛的帮助下写的正则表达式如下所示,

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 

任何人可以帮助我修改的正则表达式是已经存在,以适应这需要?

感谢

回答

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'] 
+0

这一个不适用于第三行。它只给出fa + gq + hf + kg +作为输出。我想,fa + gq + hf + kg +是gl + jh + ke + oj + kp作为输出。你能帮我做这件事吗? – Observer

+0

@Observer查看编辑 –

+0

非常感谢!它工作 – Observer

0

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

它将包含尾部的'+',它不包含在你想要的输出中,但似乎符合你提到的标准,所以如果你不想要任何尾随的'+',这可能需要一些修改。秒。

+0

@this一个不工作的第三行。它只给出fa + gq + hf + kg +作为输出。我想,fa + gq + hf + kg +是gl + jh + ke + oj + kp作为输出。你能帮我做这件事吗? – Observer

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

这不适用于hostname.com/wqs/ck$st=+fasd。我们怎样才能使用这个工作呢?你能在这里请吗? – Observer