【问题标题】:Regularexpression to get the .com获取 .com 的正则表达式
【发布时间】:2014-05-04 01:30:20
【问题描述】:

我有多个链接...

linkslist = 
[https://test.com
,https://test1.example.com/exm/1/2/3/4
,https://test2.example.test.com/exm/1/2/3/4
,http://test3.com]

从中,我只需要提取以下内容,

https://test.com
https://test1.com
https://test2.com
http://test3.com

我已经尝试了以下,

 if re.search("http*.com",string1):
...     print "found"

【问题讨论】:

  • 你用的是什么正则表达式?
  • 总是.com 域名吗?或者您可以使用不同的域后缀,例如 .net 或 .org?
  • 是的,它也可以是 .net、.org

标签: regex


【解决方案1】:

更新:感谢@Robin 修复。它奏效了,但与我的意图有点偏离。

假设只有 http 或 https(没有端口),这可行:

(https?://(?:\w+\.)+com)(?:/.*)?

Debuggex Demo

网址在捕获组一中。

(?:\w+\.)+的解释:

  • 一个或多个
    • 一个或多个单词字符:字母、数字或下划线
    • 后跟一个文字点。

例如,这部分捕获usatoday. 和entertainment.usatoday.。 url 的所有域前 (.com) 部分。

为了安全起见,您还可以添加行尾锚点:

^(https?://(?:\w+\.)+com)(?:/.*)?$

要添加不同域的可能性,请像这样添加它们:

^(https?://(?:\w+\.)+(?:com|net|org|gov))(?:/.*)?$

请注意,这个问题及其重复问题也会有所帮助:regular expression for url

【讨论】:

  • 嗯。这是不对的。就是这样。我会修复它,并在更新中解释它。给我一点时间。很高兴你说了些什么。
  • @user1050619:我的回答有一个小问题,已经修复。
  • 1。既然你还是把它扔掉了,我认为你也可以删除可选的(?:/.*)? 它只在“锚定”解决方案中添加了一些东西,并且没有检查太多(“如果之前有/,一切都可以” )...然后您可以删除捕获组并直接使用匹配项。 2。正如您的链接所示,URL 中的字符验证是一个冗长的主题。但是\w,甚至没有-,对我来说似乎很苛刻。这里的问题是您是否需要匹配 URL 或验证 它们。如果匹配,我认为可以有更通用的解决方案(例如使用[^.]++)
  • 实际上(?:/.*)? 避免了http://foo.community.com 上的错误,所以不要介意那部分:/
  • 您当然可以消除.*,并且您可以消除/,但我会选择将其保留为边界(或者,您可以有一个实际的单词边界:\b)。这是对有限问题的有限答案,它应该对他很有效。这是一个很深的话题,正如我在答案底部的链接中提到的那样。我想看看你的解决方案。
【解决方案2】:

如果您不想具体说明 .com 部分,可以使用它。它将匹配以 http 或 https 开头的 URL,并且只会匹配到第一个正斜杠或字符串/行的末尾,包括可能存在的任何端口号。

/https?:\/\/[^\/$\s]+/i

这些是结果:

https://test.com -> https://test.com
https://test1.example.com/exm/1/2/3/4 -> https://test1.example.com
https://test2.example.test.com/exm/1/2/3/4 -> https://test2.example.test.com
http://test3.com -> http://test3.com
https://test.com:8080 -> https://test.com:8080
https://test1.example.com:3000/exm/1/2/3/4 -> https://test1.example.com:3000
https://test2.example.test.com:80/exm/1/2/3/4 -> https://test2.example.test.com:80
http://test3.com:8000 -> http://test3.com:8000

如果要排除端口号,只需在不匹配的组中添加一个冒号即可:

/https?:\/\/[^\/$\s:]+/i

如果您确实想具体说明 .com 部分,只需在最后添加:

https?:\/\/[^\/\s]+\.com

如果您只想要 .com 域,但想包含端口号,那么可以这样做:

https?:\/\/[^\/\s]+\.com(:\d+)?

【讨论】:

  • +1。这是一个很好的观点,无论前面是什么,都要上第一个斜杠,尽管为了安全起见,我会强制执行至少某种级别的特定字符(例如[\w.]+),而不仅仅是“非斜杠”。
  • 取决于我猜的用例。由于不同的顶级域允许不同的本地化字符集,因此针对合法字符进行测试需要的不仅仅是 RegExp,即挪威语 .no 域允许 æ、ø 和 å 等字符。根据所使用的 RegExp 引擎,一个简单的 \w(单词字符)匹配器可能不够用。在 JS 中 \w 不匹配这些字符。
  • 这是一个很大的话题,对吧?我在自己的答案中链接到更全面的答案。
猜你喜欢
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多