请问如何使用python的正则表达式提取url链接?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问如何使用python的正则表达式提取url链接?相关的知识,希望对你有一定的参考价值。

比如这个,如何将//之后的链接用正则表达式提取出来?谢谢!
//i0.hdslb.com/bfs/archive/33928d95e48c9bf6f5f7267402841e4da3e053d5.jpg

import re
m=re.search(r\'//[0-9A-Za-z./]+\',url)

具体要考虑连接里的字符,以及其他地方的正文字符

参考技术A url是什么格式的,通常使用正则表达式提取就可以了。追问

那请问如何具体操作呢。

如何使用正则表达式从字符串中提取第 n 个 URL?

【中文标题】如何使用正则表达式从字符串中提取第 n 个 URL?【英文标题】:How to extract nth URL from string using regex? 【发布时间】:2021-05-06 19:31:26 【问题描述】:

我想使用正则表达式提取第二个 URL,我不能使用任何其他东西,到目前为止,我已经设法使用正则表达式从字符串中提取所有 URL,但它只是给出了第一个 URL。

fun main() 
    var text = "hello world https://www.google.com hello world https://www.***.com hello world https://www.test.com"
    var regex = """((http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?)"""
    println(performRegex(text, regex))


private fun performRegex(text: String?, regex: String?): String? 
    val regexPattern = Regex("""$regex""")
    return regexPattern.find(text.toString())?.value

电流输出:https://www.google.com

预期输出:https://www.***.com

【问题讨论】:

尝试使用 findAll 并获取第二项。 不改代码就可以了。该代码仅用于演示。它只需要使用正则表达式来处理 【参考方案1】:

你可以使用

private fun performRegex(text: String?, regex: String?): String? 
    val regexPattern = Regex("""$regex""")
    val matchList = regexPattern.findAll(text.toString()).mapit.value.toList() 
    return if (matchList.size >= 2) matchList[1] else null


fun main(args: Array<String>) 
    var text = "hello world https://www.google.com hello world https://www.***.com hello world https://w...content-available-to-author-only...t.com"
    var regex = """(?:https?|ftp)://\S+"""
    println(performRegex(text, regex))

请参阅online Kotlin demo。

正则表达式是(?:https?|ftp)://\S+,它匹配http://https://ftp://,然后是任何一个或多个非空白字符。

val matchList = regexPattern.findAll(text.toString()).mapit.value.toList() 部分查找所有匹配项并将结果映射到字符串列表。

如果匹配列表大小为两个或更多,return if (matchList.size &gt;= 2) matchList[1] else null 部分返回找到的第二个匹配项,否则返回null

【讨论】:

代码仅供演示。我无法更改代码。它只需要使用正则表达式来处理 @VaibhavChopade 您将不得不修改代码,因为正则表达式是一个定义规则的字符串,匹配什么。搜索多少匹配是代码责任。 (?:http|ftp)s?://\S++.*?((?:http|ftp)s?://\S+)can work for you,但您仍然需要获取第 1 组的值。 @VaibhavChopade 当然,我已经展示了。或this way,正则表达式定义为var regex = """(?:http|ftp)s?://\S++.*?((?:http|ftp)s?://\S+)""",return 语句必须为return regexPattern.find(text.toString())?.groupValues?.getOrNull(1) 嗨@Wiktor,有没有办法只输出第二场比赛?我之前已经尝试过您的方法,但它会在两个 URL 之间输出整个文本... @VaibhavChopade 我目前的解决方案就是如何获得第 N 场比赛。第二个。你不能用纯 Java 正则表达式得到它,你必须编辑你的代码。就是这样。

以上是关于请问如何使用python的正则表达式提取url链接?的主要内容,如果未能解决你的问题,请参考以下文章

请问正则表达式如何过滤超链接和提取链接

如何使用 python/django 从字符串中提取 url?(使用正则表达式)

正则表达式使用 Python 从 HTML 中的 href 属性中提取 URL [重复]

从给定字符串中提取 url 的 C# 正则表达式模式 - 不是完整的 html url,而是裸链接

如何使用正则表达式从字符串中提取第 n 个 URL?

python提取指定字符中间的内容?