加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 如何在MATLAB中只读取txt文件中的URL

发布时间:2020-12-14 05:36:57 所属栏目:百科 来源:网络整理
导读:我有一个文本文件,其中包含多个URL以及URL的其他信息.如何读取txt文件并仅将URL保存在数组中以进行下载?我想用 C = textscan(fileId,formatspec); 我应该在格式规范中将URL作为格式提及什么? 解决方法 这不是textcan的工作;你应该使用 regular expressions
我有一个文本文件,其中包含多个URL以及URL的其他信息.如何读取txt文件并仅将URL保存在数组中以进行下载?我想用

C = textscan(fileId,formatspec);

我应该在格式规范中将URL作为格式提及什么?

解决方法

这不是textcan的工作;你应该使用 regular expressions.在MATLAB中,正则表达式描述为 here.
对于URL,请参阅 here或 here以获取其他语言的示例.

这是MATLAB中的一个例子:

% This string is obtained through textscan or something
str = {...
    'pre-URL garbage http://www.example.com/index.php?query=test&otherStuf=info more stuff here'
    'other foolish stuff ftp://localhost/home/ruler_of_the_world/awesomeContent.py 1 2 3 4 misleading://';
};


% find URLs    
C = regexpi(str,...
    ['((http|https|ftp|file)://|www.|ftp.)',...
    '[-A-Z0-9+&@#/%=~_|$?!:,.]*[A-Z0-9+&@#/%=~_|$]'],'match');

C{:}

结果:

ans = 
    'http://www.example.com/index.php?query=test&otherStuf=info'
ans = 
    'ftp://localhost/home/ruler_of_the_world/awesomeContent.py'

请注意,此正则表达式要求您包含协议,或具有领先的www.或ftp ..像example.com/universal_remote.cgi?redirect=这样的东西不匹配.

你可以继续使正则表达式覆盖越来越多的案例.然而,最终你会偶然发现最重要的结论(如here所示;我从中得到了我的正则表达式):给定完全定义精确构成有效URL的内容,没有一个正则表达式能够始终匹配每一个有效的网址.也就是说,有一些有效的URL可以让你梦寐以求,而且所显示的任何正则表达式都没有捕获这些URL.

但请记住,最后一条陈述更具理论性而非实用性 – 那些不匹配的URL有效但在实践中并不经常遇到:)换句话说,如果您的URL有一个非常标准的形式,那么您就是覆盖着我给你的正则表达式.

现在,我在pm89之前用Java建议愚弄了一下.正如我所怀疑的那样,它比正则表达式慢一个数量级,因为你在代码中引入了另一个“粘性层”(在我的时间中,差异大约慢40倍,不包括导入).这是我的版本:

import java.net.URL;
import java.net.MalformedURLException;

str = {...
    'pre-URL garbage http://www.example.com/index.php?query=test&otherStuf=info more stuff here'
    'pre--URL garbage example.com/index.php?query=test&otherStuf=info more stuff here'
    'other foolish stuff ftp://localhost/home/ruler_of_the_world/awesomeContent.py 1 2 3 4 misleading://';
};


% Attempt to convert each item into an URL.  
for ii = 1:numel(str)    
    cc = textscan(str{ii},'%s');
    for jj = 1:numel(cc{1})
        try
            url = java.net.URL(cc{1}{jj})

        catch ME
            % rethrow any non-url related errors
            if isempty(regexpi(ME.message,'MalformedURLException'))
                throw(ME);
            end

        end
    end
end

结果:

url =
    'http://www.example.com/index.php?query=test&otherStuf=info'
url =
    'ftp://localhost/home/ruler_of_the_world/awesomeContent.py'

我对java.net.URL不是很熟悉,但显然,如果没有领先的协议或标准域,它也无法找到URL(例如,example.com / path / to / page).

毫无疑问,这个片段可以改进,但我会敦促你考虑为什么你想要这个更长,本来就更慢和更丑陋的解决方案:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读