假设我有一些如下所示,
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
有人可以帮我修改已经存在的正则表达式以满足这种需求吗?
由于
答案 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