Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python3提取字符串中的所有URL_Python_Regex_Python 3.x_Url - Fatal编程技术网

使用python3提取字符串中的所有URL

使用python3提取字符串中的所有URL,python,regex,python-3.x,url,Python,Regex,Python 3.x,Url,我试图找到一种干净的方法来提取文本字符串中的所有URL 经过广泛的搜索,我发现很多帖子都建议使用正则表达式来完成这项任务,他们给出了应该使用的正则表达式。每个正则表达式都有一些优点和缺点。此外,编辑它们以改变它们的行为也不是直截了当的。无论如何,在这一点上,我对任何能够正确检测本文中URL的正则表达式都感到满意: 输入: 同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲。我是你的朋友 你的例子是: 毕竟,若列表元素中

我试图找到一种干净的方法来提取文本字符串中的所有URL

经过广泛的搜索,我发现很多帖子都建议使用正则表达式来完成这项任务,他们给出了应该使用的正则表达式。每个正则表达式都有一些优点和缺点。此外,编辑它们以改变它们的行为也不是直截了当的。无论如何,在这一点上,我对任何能够正确检测本文中URL的正则表达式都感到满意:

输入:

同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲、同侧盲。我是你的朋友 你的例子是:

毕竟,若列表元素中的最后一个字符不是字母,那个么也可以剪切它

编辑:

output = [x for x in input().split() if x.startswith('http://') or x.startswith('https://') or x.startswith('ftp://')]
newOutput = []
for link in output:
    copy = link
    while not copy[-1].isalpha():
        copy = copy[:-1]
    newOutput.append(copy)
print(newOutput)

您的示例:

如果您想要一个正则表达式,可以使用:

import re


string = "Lorem ipsum dolor sit amet https://www.lorem.com/ipsum.php?q=suas, nusquam tincidunt ex per, ius modus integre no, quando utroque placerat qui no. Mea conclusionemque vituperatoribus et, omnes malorum est id, pri omnes atomorum expetenda ex. Elit pertinacia no eos, nonumy comprehensam id mei. Ei eum maiestatis quaerendum https://www.lorem.orgApart from what others mentioned, since you've asked for something that already exists, you might want to try URLExtract. 

Apparently it tries to find any occurrence of TLD in given text. If TLD is found, it starts from that position to expand boundaries to both sides searching for a "stop character" (usually white space, comma, single or double quote).

You have a couple of examples here.

from urlextract import URLExtract

extractor = URLExtract()
urls = extractor.find_urls("Let's have URL youfellasleepwhilewritingyourtitle.com as an example.")
print(urls) # prints: ['youfellasleepwhilewritingyourtitle.cz']
重新导入

字符串=“Lorem ipsum dolor sit amethttps://www.lorem.com/ipsum.php?q=suas结果表明,这是一个非常重要的结论,它是一个非常重要的结论。我是你的朋友https://www.lorem.org除了其他人提到的,因为你已经要求一些已经存在的东西,你可能想试试

显然,它试图在给定的文本中找到TLD的任何出现。如果找到TLD,它将从该位置开始将边界扩展到两侧,搜索“停止字符”(通常为空格、逗号、单引号或双引号)

你有几个例子

这个模块似乎还有一个
update()
方法,可以更新TLD列表缓存文件

但是,如果这不符合您的特定要求,您可以在使用上述模块(或任何其他解析URL的方式)处理URL后手动执行一些检查。例如,假设您得到一个URL列表:

allowed_protocols = ['protocol_1', 'protocol_2']
allowed_tlds = ['tld_1', 'tld_2', 'tld_3']
allowed_domains = ['domain_1']

for each_url in results:
    # here, check each url against your rules
然后,您可以构建另一个包含排除的域/TLD/etc的列表:

import re
import string
text = """
Lorem ipsum dolor sit amet https://www.lore-m.com/ipsum.php?q=suas, 
nusquam tincidunt ex per, ftp://link.com ius modus integre no, quando utroque placerat qui no. 
Mea conclusionemque vituperatoribus et, omnes malorum est id, pri omnes atomorum expetenda ex. 
Elit ftp://link.work.in pertinacia no eos, nonumy comprehensam id mei. Ei eum maiestatis quaerendum https://www.lorem.orgUsing an existing library is probably the best solution.

But it was too much for my tiny script, and -- inspired by @piotr-wasilewiczs answer-- I came up with:

from string import ascii_letters
links = [x for x in line.split() if x.strip(str(set(x) - set(ascii_letters))).startswith(('http', 'https', 'www'))]
重新导入
导入字符串
text=”“”
Lorem ipsum dolor sit amethttps://www.lore-m.com/ipsum.php?q=suas, 
nusquam tincidunt工厂交货,ftp://link.com 第二种方式的整数编号,第二种方式的整数编号。
Mea结论是,无论是对动物还是对动物,都要进行严格的监督。

精英ftp://link.work.in 不含eos的紫锥菊,非肿瘤综合征https://www.lorem.org使用现有库可能是最好的解决方案

但这对我的小剧本来说太难了,受@piotr Wasilewicz回答的启发,我想出了:

  • 对于行中的每个单词
  • (从开头和结尾)去掉单词本身中的非ASCII字母)
  • 并通过以https、http、www中的一个开头的单词进行过滤

对我来说有点太密集了,我不知道它有多快,但它应该能检测到字符串中的大多数“正常”URL。

谢谢你的回复。你的方法无法排除“不”中的smily。只要“如果列表元素中的最后一个字符不是字母,就删掉它。”@Ouss现在检查我的答案。也可以尝试一下:content=input.split(“”)newOutput=[]对于内容中的val:if val.startswith('http://')或val.startswith('https://'):newOutput.append(val)@AnubhavSingh我认为理解列表在这里更好。和
content=input().split(“”)
:)我想你在写问题标题时睡着了……也许吧。因此,我已经编辑了问题标题…再次检查您的结果是否与您所写的不符,它是
['https://www.lorem.com/', 'https://www.lorem.org.', 'http://news.bbc.co.“]
Ohhh很抱歉,我在复制和粘贴代码时输入了一个错误,小姐写信给\d@Gahan,感谢您的关注
allowed_protocols = ['protocol_1', 'protocol_2']
allowed_tlds = ['tld_1', 'tld_2', 'tld_3']
allowed_domains = ['domain_1']

for each_url in results:
    # here, check each url against your rules
import re
import string
text = """
Lorem ipsum dolor sit amet https://www.lore-m.com/ipsum.php?q=suas, 
nusquam tincidunt ex per, ftp://link.com ius modus integre no, quando utroque placerat qui no. 
Mea conclusionemque vituperatoribus et, omnes malorum est id, pri omnes atomorum expetenda ex. 
Elit ftp://link.work.in pertinacia no eos, nonumy comprehensam id mei. Ei eum maiestatis quaerendum https://www.lorem.orgUsing an existing library is probably the best solution.

But it was too much for my tiny script, and -- inspired by @piotr-wasilewiczs answer-- I came up with:

from string import ascii_letters
links = [x for x in line.split() if x.strip(str(set(x) - set(ascii_letters))).startswith(('http', 'https', 'www'))]