正则表达式向后搜索直至"/"的所有字符
我在使用这个正则表达式时遇到了一些麻烦,我觉得我快搞定了。
m =re.findall('[a-z]{6}\.[a-z]{3}\.[a-z]{2} (?=\" target)', 'http://domain.com.uy " target')
这个正则表达式给了我想要的“准确”输出,也就是 domain.com.uy
,但显然这只是个例子,因为 [a-z]{6}
只是匹配前面的6个字符,这不是我想要的。
我希望它能返回 domain.com.uy
,所以基本上我的要求是匹配任何字符,直到遇到“/”为止(反向匹配)。
编辑:
m =re.findall('\w+\.[a-z]{3}\.[a-z]{2} (?=\" target)', 'http://domain.com.uy " target')
这个正则表达式离我想要的很近,但它不匹配“_”或“-”。
为了完整起见,我不需要 http://
。
我希望这个问题足够清楚,如果我有哪里没说清楚,请随时问我需要澄清的地方!
提前谢谢大家!
4 个回答
1
如果你不需要使用正则表达式,只是想从网址中提取出完整域名(FQDN),可以在Python中使用 urlparse
和 str.split()
方法。
>>> from urlparse import urlparse
>>> url = 'http://domain.com.uy " target'
>>> urlparse(url)
ParseResult(scheme='http', netloc='domain.com.uy " target', path='', params='', query='', fragment='')
这样做会把网址分解成几个部分。我们需要的是 netloc
这一部分:
>>> urlparse(url).netloc
'domain.com.uy " target'
接下来,按空格分开:
>>> urlparse(url).netloc.split()
['domain.com.uy', '"', 'target']
最后,只取第一部分:
>>> urlparse(url).netloc.split()[0]
'domain.com.uy'
1
试试这个(也许你需要在Python中对/
进行转义):
/([^/]*)$
1
另一种选择是使用一种叫做 正向查找 的方法,比如 (?<=//)
:
>>> re.search(r'(?<=//).+(?= \" target)',
... 'http://domain.com.uy " target').group(0)
'domain.com.uy'
需要注意的是,这样会匹配到网址中的斜杠,如果你需要的话:
>>> re.search(r'(?<=//).+(?= \" target)',
... 'http://example.com/path/to/whatever " target').group(0)
'example.com/path/to/whatever'
如果你只想要最简单的域名,不带任何路径或查询参数,可以使用 r'(?<=//)([^/]+)(/.*)?(?= \" target)'
,并提取第一个捕获组:
>>> re.search(r'(?<=//)([^/]+)(/.*)?(?= \" target)',
... 'http://example.com/path/to/whatever " target').groups()
('example.com', '/path/to/whatever')