正则表达式向后搜索直至"/"的所有字符

2 投票
4 回答
1975 浏览
提问于 2025-04-16 20:06

我在使用这个正则表达式时遇到了一些麻烦,我觉得我快搞定了。

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中使用 urlparsestr.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')

撰写回答