【问题标题】:Regex to return all characters until "/" searching backwards正则表达式返回所有字符,直到“/”向后搜索
【发布时间】:2011-09-20 16:28:51
【问题描述】:

我在使用这个正则表达式时遇到了问题,我想我快到了。

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://

我希望这个问题足够清楚,如果我留下任何可以解释的地方,请要求任何需要的澄清!

提前致谢!

【问题讨论】:

标签: python regex findall


【解决方案1】:

另一种选择是使用positive lookbehind,例如(?<=//)

>>> re.search(r'(?<=//).+(?= \" target)', 
...           'http://domain.com.uy " target').group(0)
'domain.com.uy'

请注意,如果需要,这将匹配 url 本身内的斜杠:

>>> re.search(r'(?<=//).+(?= \" target)',
...           'http://example.com/path/to/whatever " target').group(0)
'example.com/path/to/whatever'

如果您只想要裸域,没有任何路径或查询参数,您可以使用r'(?&lt;=//)([^/]+)(/.*)?(?= \" target)' 并捕获组 1:

>>> re.search(r'(?<=//)([^/]+)(/.*)?(?= \" target)',
...           'http://example.com/path/to/whatever " target').groups()
('example.com', '/path/to/whatever')

【讨论】:

  • 第一个正是我想要的!!非常感谢,我显然使用了一种非常奇怪的方法!谢谢! +1
【解决方案2】:

如果正则表达式不是必需的,并且您只是希望从 Python 中的 URL 中提取 FQDN。使用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='')

这已将 URL 分解为其组成部分。我们要netloc:

>>> urlparse(url).netloc
'domain.com.uy " target'

按空格分割:

>>> urlparse(url).netloc.split()
['domain.com.uy', '"', 'target']

只是第一部分:

>>> urlparse(url).netloc.split()[0]
'domain.com.uy'

【讨论】:

  • 我会看看这个,我绝对不需要正则表达式,尽管在这种情况下它可能是一个不错的选择。
  • 当 regexp 和 url 在同一个句子中使用时,通常听起来是个坏主意。 +1
  • 问你真正想知道的——不是“我如何让技术 X 工作来解决问题 Y?”,而是“我如何解决问题 Y?”。
【解决方案3】:

试试这个(也许你需要在 Python 中转义 /):

/([^/]*)$

【讨论】:

  • 这也会捕获不需要的斜线。 :>
  • 也许我在做一些愚蠢的事情,我不太擅长正则表达式,他们花了我很多时间,你的意思是这样 m =re.findall('/([^/]*)$[a-z]\.[a-z]{3}\.[a-z]{2} (?=\" target)', 'http://domain.com.uy " target') 因为它不起作用。
  • @Leif 它不会捕捉斜线,如果根本没有斜线,它就不会工作。我同意你可以删除它。
  • @Trufa 我不知道 Python 正则表达式的语法,但我给了你一个完整的正则表达式,而不是你的 :-) 你想获得域名吗?因为从头到尾的一切都不是一回事。
  • @Thresh:哦,抱歉,我很讨厌阅读正则表达式,这需要我很长时间,我现在就试试你的,知道它不是扩展。对不起,谢谢!
【解决方案4】:

就这么简单:

[^/]+(?= " target)

但请注意,http://domain.com/folder/site.php 不会返回域。 并记住在字符串中正确转义正则表达式。

【讨论】:

  • 抱歉,我不太擅长正则表达式,请花很多时间来理解您的意思? m =re.findall('[^/]+$[a-z]\.[a-z]{3}\.[a-z]{2} (?=\" target)', 'http://domain.com.uy " target') 因为它不起作用。
  • 抱歉,误会了。纠正这一点。顺便说一句,你必须使用我的整个正则表达式。
猜你喜欢
  • 1970-01-01
  • 2014-01-23
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
相关资源
最近更新 更多