【问题标题】:Regex for URL without path没有路径的 URL 的正则表达式
【发布时间】:2023-01-23 18:01:58
【问题描述】:

我知道这个案例有很多解决方案、文章和库,但找不到一个符合我的案例。我正在尝试编写一个正则表达式来从文本(电子邮件中的人的签名)中提取 URL(代表网站),并且有多种情况:

  • 可以包含 http(s):// ,也可以不包含
  • 可以包含 www. , 或不
  • 可以有多个顶级域名,例如“test.com.cn”

这里有些例子:

www.test.com
https://test.com.cn
http://www.test.com.cn
test.com
test.com.cn

我想出了以下正则表达式:

(https?://)?(www\.)?\w{2,}\.[a-zA-Z]{2,}(\.[a-zA-Z]{2,})?$

但这有两个主要问题,因为签名可以包含电子邮件地址:

  1. 它(错误地)捕获像这样的电子邮件的 TLD:name.surname@test2.com
  2. 它不会捕获行中间的 URLS,如果我删除末尾的 $ 符号,它会捕获最后一个示例的 name.surname 部分

    对于 (1) 我尝试使用 negative lookbehind,将这个 (?<!@) 添加到开头,问题是现在它捕获了 est2.com 而不是根本不匹配它。

【问题讨论】:

    标签: python regex url


    【解决方案1】:

    我认为你可以使用 (边界)而不是 $ (并且在开始时也是如此)并在负向后视和前视中排除 @

    (?<!@|.|-)(https?://)?(www.)?w{2,}.[a-zA-Z]{2,}(.[a-zA-Z]{2,})?(?!@|.|-)
    

    编辑:排除环视中的点(以及所有可能出现在 URL/电子邮件地址中的非字母数字字符),以避免匹配 name.middlename.surname@test2.com 中的 name.middlenamename.surname@test2.com.cn 中的 com.cn。字符列表见this answer

    【讨论】:

    • 谢谢,它几乎可以工作,但现在它在 name.surname@test2.com.cn 中捕获了 com.cn
    • 哈哈对!我的编辑也应该适用于后视!马上换
    猜你喜欢
    • 1970-01-01
    • 2013-11-02
    • 2012-08-14
    • 1970-01-01
    • 2020-01-18
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多